GDI 程式設計

2021-05-22 10:03:26 字數 3847 閱讀 1515

image和bitmap類概述

gdi+的image類封裝了對bmp、gif、jpeg、png、tiff、wmf(windows元檔案)和emf(增強wmf)影象檔案的調入、格式轉換以及簡單處理的功能。而bitmap是從image類繼承的乙個影象類,它封裝了windows點陣圖操作的常用功能。例如,bitmap::setpixel和bitmap::getpixel分別用來對位圖進行讀寫畫素操作,從而可以為影象的柔化和銳化處理提供一種可能。

3.drawimage方法

drawimage是gdi+的graphics類顯示影象的核心方法,它的過載函式有許多個。常用的一般過載函式有:

status drawimage( image* image, int x, int y);

status drawimage( image* image, const rect& rect);

status drawimage( image* image, const point* destpoints, int count);

status drawimage( image* image, int x, int y,

int srcx, int srcy, int srcwidth, int srcheight, unit srcunit);

其中,(x,y)用來指定影象image顯示的位置,這個位置和image影象的左上角點相對應。rect用來指定被影象填充的矩形區域, destpoints和count分別用來指定乙個多邊形的頂點和頂點個數。若count為3時,則表示該多邊形是乙個平行四邊形,另乙個頂點由系統自動給出。此時,destpoints中的資料依次對應於源影象的左上角、右上角和左下角的頂點座標。srcx、srcy、srcwidth 和srcheight用來指定要顯示的源影象的位置和大小,srcunit用來指定所使用的單位,預設時使用pageunitpixel,即用畫素作為度量單位。

呼叫和顯示影象檔案

在gdi+中呼叫和顯示影象檔案是非常容易的,一般先通過image或bitmap調入乙個影象檔案構造乙個物件,然後呼叫graphics::drawimage方法在指定位置處顯示全部或部分影象。例如下面的**:

void cex_gdiplusview::ondraw(cdc* pdc)

結果如圖7.17所示,從圖中我們可以看出,兩次drawimage的結果是不同的,按理應該相同,這是怎麼一回事?原來,drawimage在不指定顯示區域大小時會自動根據裝置解析度進行縮放,從而造成顯示結果的不同。

當然,也可以使用bitmap類來調入影象檔案來構造乙個bitmap物件,其結果也是一樣的。例如,上述**可改為:

需要說明的是,image還提供getthumbnailimage的方法用來獲得乙個縮圖的指標,呼叫drawimage後可將該縮圖顯示,這在影象預覽時極其有用。例如下面的**:

// 顯示縮圖

graphics.drawimage(pthumbnail, 20, 20);

// 使用後,不要忘記刪除該縮圖指標

delete pthumbnail;

影象旋轉和拉伸

影象的旋轉和拉伸通常是通過在drawimage中指定destpoints引數來實現,destpoints包含對新的座標系定義的點的資料。圖7.18說明了座標系定義的方法。

從圖中可以看出,destpoints中的第乙個點是用來定義座標原點的,第二點用來定義x軸的方法和影象x方向的大小,第三個是用來定義y軸的方法和影象y方向的大小。若destpoints定義的新座標系中兩軸方向不垂直,就能達到影象拉伸的效果。

下面的**就是影象旋轉和拉伸的乙個示例,其結果如圖7.19所示。

matrix matrix(1,0,0,1,230,10); // 定義乙個單位矩陣,座標原點在(230,10)

matrix.rotate(30); // 順時針旋轉30度

matrix.scale(0.63,0.6); // x 和 y 方向分別乘以0.63和0.6比例因子

matrix.transformpoints(points, 3); // 用該矩陣轉換points

graphics.drawimage(&image, points, 3);

point newpoints = ;

graphics.drawimage(&image, newpoints, 3);

當然,對於影象旋轉還可直接使用graphics::rotatetransform來進行,例如下面的**。但這樣設定後,以後所有的繪圖結果均會旋轉,有時可能感覺不方便。

graphics.translatetransform(230,10); // 將原點移動到(230,10)

graphics.rotatetransform(30); // 順時針旋轉30度

graphics.drawimage(&image, 0,0);

調整插補演算法的質量

當影象進行縮放時,需要對影象畫素進行插補,不同的插補演算法其效果是不一樣的。graphics:: setinterpolationmode可以讓我們根據自己的需要使用不同質量效果的插補演算法。當然,質量越高,其渲染時間越長。下面的**就是使用不同質量效果的插補演算法模式,其結果如圖7.20所示。

graphics graphics( pdc->m_hdc );

image image(l"log.gif");

uint width = image.getwidth();

uint height = image.getheight();

// 不進行縮放

graphics.drawimage( &image,10,10);

// 使用低質量的插補演算法

graphics.setinterpolationmode(interpolationmodenearestneighbor);

graphics.drawimage( &image,

rect(170, 30, (int)(0.6*width), (int)(0.6*height)));

// 使用中等質量的插補演算法

graphics.setinterpolationmode(interpolationmodehighqualitybilinear);

graphics.drawimage( &image,

rect(270, 30, (int)(0.6*width), (int)(0.6*height)));

// 使用高質量的插補演算法

graphics.setinterpolationmode(interpolationmodehighqualitybicubic);

graphics.drawimage( &image,

rect(370, 30, (int)(0.6*width), (int)(0.6*height)));

事實上,image功能還不止這些,例如還有不同格式檔案之間的轉換等。但這些功能和mfc的新類cimage功能基本一樣,但cimage更符合mfc程式設計師的程式設計習慣

GDI程式設計

一 gdi 相關概念 1 gdi graphics device inte ce 圖形裝置介面,是乙個應用程式與輸出裝置之間的中介。它提供了一套函式庫,這些函式在不同的輸出裝置上輸出圖形和文字。一方面,gdi 向應用程式提供乙個與裝置無關的程式設計環境,另一方面,它又以裝置相關的格式和具體的裝置打交...

GDI 程式設計

最近在學習vc mfc學習 就所學記錄下筆記 1 新增gdiplus.h檔案 通常在標頭檔案檔案中新增 如下 include include using namespace gdiplus 2 新增gdiplus.lib連線 方法一 直接在stdafx.h檔案中新增 pragma comment l...

使用GDI 程式設計

1.引言 gdi 是windows xp中的乙個子系統,它主要負責在顯示螢幕和列印裝置輸出有關資訊,它是一組通過c 類實現的應用程式程式設計介面。顧名思義,gdi 是以前版本gdi的繼承者,出於相容性考慮,windows xp仍然支援以前版本的gdi,但是在開發新應用程式的時候,開發人員為了滿足圖形...