用VB寫高效的圖像處理程序_第1頁(yè)
用VB寫高效的圖像處理程序_第2頁(yè)
用VB寫高效的圖像處理程序_第3頁(yè)
用VB寫高效的圖像處理程序_第4頁(yè)
用VB寫高效的圖像處理程序_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、用VB寫高效的圖像處理程序自盤古開(kāi)天地以來(lái)(好像夸張了點(diǎn)),一直有人抱怨 VB程序速度慢。 特別是圖像處理,被認(rèn)為是 VB的禁區(qū)。說(shuō)起來(lái)也是,市面上的關(guān)于 VB的圖像處理的數(shù)據(jù)都是先講計(jì)算公式,再直接用PSet (或API函數(shù)SetPixel )逐點(diǎn)畫(至少我見(jiàn)過(guò)的書都是這樣)。效果是辦到了, 但速度慢得離譜:對(duì)一幅640*480的圖像進(jìn)行半透明合并就需要10 秒鐘;而在PhotoShop中,只要一設(shè)置圖層的透明度,半透明效果立 即呈現(xiàn)。難怪有人說(shuō) VB的閑話。但這并不表示VB不能寫高速的圖像處理程序,速度慢是因?yàn)闆](méi) 有使用正確的方法。從VB5開(kāi)始,能以本機(jī)代碼編譯成exe文件,所以不存在代碼

2、執(zhí) 行速度的問(wèn)題。那么,是什么拖慢了速度呢?就是 PSet和SetPixel ! PSet把浮點(diǎn)形式的坐標(biāo)轉(zhuǎn)為像素單位,再交給 SetPixel處理。而 SetPixel呢,坐標(biāo)系轉(zhuǎn)化、剪裁區(qū)域判斷、將顏色匹配為設(shè)備支持 的最接近的,最后還要根據(jù)不同的顏色格式尋址、為將顏色寫入其所在位進(jìn)行位運(yùn)算。經(jīng)過(guò)這么多層處理,速度不慢才怪。那么,怎樣才能提高處理速度呢?使用 DIB,直接對(duì)位圖所在內(nèi) 存進(jìn)行操作,速度可以大大提高?,F(xiàn)在看看,這只是一個(gè)簡(jiǎn)單的色彩 演示程序。CPU賽揚(yáng)333;內(nèi)存:PC100 (很老的概念了)的 SDRAM128MB單位:毫秒Win dows 98Wndows XP說(shuō)明VB

3、PSet1,199.4553786.1885在VB使用PSet畫的VB SetPixel872.3621451.3712在VB使用SetPixelV 畫的VB DIB8.22188.2226在VB使用DIB畫的VB DIB Ptr9.67839.4420在VB使用DIBSection + 模擬指針畫的VC(Debug)6.68966.6503VC寫的(Debug版)VC(Release)3.27363.6247VC寫的(Release 版)從這個(gè)表中可看出:1. VC比VB_DIB VB_DIB_Ptr快兩倍,這是因?yàn)?SafeArray結(jié)構(gòu)的數(shù)組比真正的指針慢,但也不是某些人所說(shuō)的70100

4、倍;2. VB_DIB_Ptr比VB_DIB慢一點(diǎn),這是因?yàn)槟M指針本來(lái)就是靠SafeArray結(jié)構(gòu)的數(shù)組,而且模擬指針需要對(duì)兩個(gè)數(shù)組進(jìn)行操作,所 以速度慢一點(diǎn);3. 真正差了 70100倍是 VB_PSet和 VB_SetPixel,特別是 VB_PSet在 Windows98下與 VB_DIB差了 145 倍。以上可證,速度慢的原因是SetPixel非常低效,而并不是VB的 問(wèn)題。雖然VC的的確比較快,但是我寫這篇文章不是為了討論速度 極限(否則這篇文章會(huì)改名為如何用匯編寫高速的圖像處理程序), 而是為了告訴大家如何在 VB中寫能夠?qū)崟r(shí)處理的圖像處理程序。在 Windows 3.0以前,W

5、indows系統(tǒng)用的是DDB設(shè)備有關(guān)位圖)。DDB沒(méi)有調(diào)色板,顯示的顏色依賴硬件,處理色彩很不方便。所以Microsoft 在 Windows 3.0 中 重新定義了 BMP文件格式(BMP3.0), 使其支持設(shè)備無(wú)關(guān)位圖一一也就是DIB。時(shí)至今日,BM啲版本號(hào)已升至 5.0(WindowsNT4.0、Windows95定義了 BMP 4.0 , Windows 98 Windows 2000 定義了 BMP 5.0 ),但基本結(jié)構(gòu)沒(méi)有變一一仍是 BMP文件頭和DIB組成:BMP文 件BITMAPFILEHEADEMP文件頭DIBBITMAPINFOHEAt位圖信息頭BITMAPINFRGBQ

6、UAD調(diào)色板位圖數(shù)據(jù)(制弋表可以不填(=0)的項(xiàng)目BMP文件頭BITMAPFILEHEADER原型定義:ypedef struct tagBITMAPFILEHEADER / bmfh WORD bfType; DWORD bfSize; WORbfReservedl; WORDfReserved2; DWORDfOffBits; BITMAPFILEHEADEVB聲明:Type BITMAPFILEHEADER bfType(0 to 1) As Byte bfSize As Lo ng bfReservedl As In teger bfReserved2 As In teger bfOf

7、fBits As Long End Type說(shuō)明:bfType指示文件的類型,必須是“ BMbfSize#指示文件的大小,包括 BITMAPFILEHEADERbfReservedl保留,=0bfReserved2保留,=0bfOffBits#從文件頭到位圖數(shù)據(jù)的偏移字節(jié)數(shù)文件信息頭BITMAPINFOHEADER原型定義:ypedef struct tagBITMAPINFOHEADERbmih DWORD biSize; LONG biWidth; _ONGbiHeight; WORDPIanes; WORDBitCount; DWORDCompression; DWORD biSizeI

8、mage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biCL_Used; DWORD biCirimport anL; BITMAPINFOHEADER;VB聲明:Type BITMAPINFOHEADER biSize As Lo ng biWidth As Long biHeight As Long biPla nes As In teger biBitCo unt As In teger biCompressi on As Long biSizeimage As Lo ng biXPelsPerMeter As Long biY

9、PelsPerMeter As Long biCIrUsed As Long biCirimporta nt As Long End Type說(shuō)明:biSizeBITMAPINFOHEAD結(jié)構(gòu)的大小。BMP有多個(gè)版本,就靠 biSize來(lái)區(qū)別:BMP3.0 BITMAPINFOHEADER40)BMP4.0 BITMAPV4HEADER108)BMP5.0 BITMAPV5HEADER124)biWidth位圖的高度,單位是像素biHeight位圖的寬度,單位是像素biPla nes設(shè)備的位平面數(shù)。現(xiàn)在都是1biBitCou nt圖像的顏色位數(shù)0 :當(dāng) biCompression=BI_JPE

10、G 時(shí)必須為 0( BMP5.0)1 :單色位圖4 : 16色位圖8 : 256色位圖16:增強(qiáng)色位圖,默認(rèn)為555格式24:真彩色位圖32: 32位位圖,默認(rèn)情況下 Windows不會(huì)處理最高8 位,可以將它作為自己的 Alpha通道biCompressio n壓縮方式BI_RGB無(wú)壓縮BI_RLE8行程編碼壓縮,biBitCount必須等于8BI_RLE4:行程編碼壓縮,biBitCount必須等于4BI_BITFIELDS : 指定 RGB掩碼,biBitCount 必須等于 16、32BI_JPEG JPEG壓縮(BMP 5.0)BI PNG PNG壓縮(BMP 5.0)biSizei

11、mage#實(shí)際的位圖數(shù)據(jù)所占字節(jié)(biCompression=BI RGB時(shí)可以 省略)biXPelsPerMeter#目標(biāo)設(shè)備的水平分辨率,單位是每米的像素個(gè)數(shù)biYPelsPerMeter#目標(biāo)設(shè)備的垂直分辨率,單位是每米的像素個(gè)數(shù)biClrUsed#使用的顏色數(shù)(當(dāng)biBitCount等于1、4、8時(shí)才有效)。 如果該項(xiàng)為0,表示顏色數(shù)為2AbiBitCountbiClrimporta nt#重要的顏色數(shù)。如果該項(xiàng)為0,表示所有顏色都是重要的調(diào)色板只有biBitCount等于1、4、8時(shí)才有調(diào)色板。調(diào)色板實(shí)際上是一個(gè)數(shù)組,元素的個(gè)數(shù)由biBitCount 和biClrUsed 決定。原型

12、定義:ypedef struct tagRGBQUAD / rgbq BYTE rgbBlue; BYTE rgbGree n; BYTE gbRed; BYTE rgbReserved; RGBQUAD;VB聲明:Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte gbReserved As Byte End Type說(shuō)明:gbBlue 藍(lán)色分量rgbGree n綠色分量rgbRed紅色分量rgbReserved#保留,=0位圖數(shù)據(jù)掃描行:一行的圖像數(shù)據(jù)叫做一個(gè)掃描行。一個(gè)掃描行的長(zhǎng)度必須是4的倍數(shù)(字節(jié))

13、,如果不是,則需要補(bǔ)齊。計(jì)算公式:_in eBytes=(biWidth*biBitCou nt+31)A nd &HFFFFFFE0)8由于BMPS定者認(rèn)為數(shù)學(xué)坐標(biāo)系更總要,所以DIB的掃描行是逆序存儲(chǔ)的(相 對(duì)于屏幕坐標(biāo)系而言),即屏幕上的第一行是DIB位圖數(shù)據(jù)的最后一行。 1位色:用1位表示一個(gè)像素,所以一個(gè)字節(jié)可以表示8個(gè)像素。坐標(biāo)是從最左邊(最 高位)開(kāi)始的,而不是一般情況下的最低位。在內(nèi)存的擺放形式如下:字節(jié)0.位76!5430傢素(01:234156>7 4位色:用4位表示一個(gè)像素,所以一個(gè)字節(jié)可以表示2個(gè)像素。坐標(biāo)是從最左邊(最 高位)開(kāi)始的,而不是一般情況下的最

14、低位。在內(nèi)存的擺放形式如下:字節(jié)0位76!5432>10像素01像素位32 -1032>10 8位色:用8位表示一個(gè)像素,所以一個(gè)字節(jié)剛好只能表示一個(gè)像素。 在內(nèi)存的擺放 形式如下:字節(jié)0像素0 16位色:用16位表示一個(gè)像素,所以兩個(gè)字節(jié)可以表示 1個(gè)像素。默認(rèn)情況下16 位 DIB是555格式,最高位無(wú)效(這對(duì) VB是個(gè)福音,因?yàn)閂B沒(méi)有16位無(wú)符號(hào) 型)。在內(nèi)存的擺放形式如下(PC機(jī)是低字節(jié)在前):字節(jié)0123位765432M0'7654132107654:321076554:32'10像素01RGBGB c RGGBx RGRGB位210432>10(

15、)432!1043:2104:321004343 24位色:用24位表示一個(gè)像素,所以三個(gè)字節(jié)可以表示 1個(gè)像素。注意它的順序是 BGR而不是傳統(tǒng)的RGB在內(nèi)存的擺放形式如下:字節(jié)012345.像素0 1丄RGBBGR 32位色:用32位表示一個(gè)像素,所以四個(gè)字節(jié)可以表示 1個(gè)像素。注意絕大多數(shù)的 GDI函數(shù)不會(huì)處理Alpha通道(只有AlphaBlend支持)。在內(nèi)存的擺放形式如 下:字節(jié)C)1彳341豐|7像素01RGEE3GRAB(G中SetDIBitsToDevice原型定義:nt SetDIBitsToDevice( HDC hDC, / han dle to device con

16、text int XDest,/ x-coordi nate of upper-left corner of dest. rect. int YDest, / y-coord in ateof upper-left corner of dest. rect. DWORDWWidth, / sourceecta ngle width DWORD dwHeight, / source recta ngle height int XSrc, / x-coord in ate of lower-left corner of source rect. i nt YSrc, / y-coord in at

17、e of lower-left corner of source rect. UINT uStartSca n, / irst sca n line in array UINT cSca nLin es, / nu mber of sca n lines CONST VOID*lpvBits, / address of array with DIB bits CONSBITMAPINFOIpbmi, / address of structure with bitmap info. UINT fuColorUse / RGBbr palette n dexes );VB聲明:Declare Fu

18、n ction SetDIBitsToDevice Lib "gdi32.dll" (ByVal hDC As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal dwWidth As Long, ByVal dwHeight As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal uStartScan As Long, ByVal cSca nLines As Lon g, lpvBits As Any, Ipbmi As Any, ByVal uColorUse

19、 As Long) As Long說(shuō)明:將一幅與設(shè)備無(wú)關(guān)位圖的全部或部分?jǐn)?shù)據(jù)直接復(fù)制到一個(gè)設(shè)備。這個(gè)函數(shù)在設(shè)備 中定義了一個(gè)目標(biāo)矩形,以便接收位圖數(shù)據(jù)。它也在 DIB中定義了一個(gè)源矩形, 以便從中提取數(shù)據(jù)返回值:如函數(shù)執(zhí)行成功,返回欲復(fù)制的掃描線的數(shù)量;如返回常數(shù)GDI ERROR表示出錯(cuò)參數(shù):hDC一個(gè)設(shè)備場(chǎng)景的句柄。該場(chǎng)景用于接收位圖數(shù)據(jù)XDest指定繪制區(qū)域的左上角X坐標(biāo)YDest指定繪制區(qū)域的左上角丫坐標(biāo)dwWidth指定繪制區(qū)域的高度dwHeight指定繪制區(qū)域的寬度XSrc矩形在DIB中的起點(diǎn)X坐標(biāo)YSrc矩形在DIB中的起點(diǎn)Y坐標(biāo)u StartSca npvBits 中第一條掃描

20、線的編號(hào)。如lpbmi之BITMAPINFOHEADERI 分的biHeight字段是正數(shù),那么這條掃描線就會(huì)從位圖的底部開(kāi) 始計(jì)算;如果是負(fù)數(shù),就從頂部開(kāi)始計(jì)算cSca nLines欲復(fù)制的掃描線數(shù)量pvBits指向一個(gè)緩沖區(qū)的指針。這個(gè)緩沖區(qū)包含了以DIB格式描述的位圖數(shù)據(jù);這種格式是由lpbmi指定的pbmi指向BITMAPINFQ為兼容BMP4/5而聲明成 Any),對(duì)DIB的格式 和顏色進(jìn)行描述的一個(gè)結(jié)構(gòu)UColorUsePA| CO|O顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選入 一 一 LORDc設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引DIB RGB COLC顏色表包含了 RGB顏色Stretc

21、hDIBits原型定義:nt StretchDIBits( HDC hDC, / handle to device con text int XDest, / x-coord in ate of upper-left corner of dest. recta ngle int YDest, / y-coord in ate of upper-left corner of dest. recta ngle int n DestWidth, / width of destination rectangle int nDestHeight, / height of destination ecta

22、 ngle int XSrc, / x-coord in ate of upper-left corner of source ecta ngle int YSrc, / y-coord in ate of upper-left corner of source rectangle int nSrcWidth, / width of source rectangle int nSrcHeight, / height of source rectangle CONST7OID *lpBits,/ address of bitmap bitsCONST BITMAPINFO *lpBitsI nf

23、o, / address of bit map data UINT iUsage, / u sage flags DWORD dwRop / raster operati on code );7B聲明:Declare Function StretchDIBits Lib "gdi32" (ByVal hDCAs Long, ByVal XDest As Long, ByVal YDest As Long, ByVal n DestWidth As Long, ByVal n DestHeight As Long, ByVal XSrc As Long, ByVal YSrc

24、 As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, lpBits As Any, IpBitsInfo As Any, ByVal wUsag As Long, ByVal dwRop As Long) As Long說(shuō)明:根據(jù)一幅與設(shè)備無(wú)關(guān)的位圖創(chuàng)建一幅與設(shè)備有關(guān)的位圖返回值:執(zhí)行成功返回位圖句柄,零表示失敗參數(shù):hDC一個(gè)設(shè)備場(chǎng)景的句柄,該設(shè)備場(chǎng)景定義了要?jiǎng)?chuàng)建的與設(shè)備有關(guān)位 圖的配置信息XDest指定繪制區(qū)域的左上角X坐標(biāo)YDest指定繪制區(qū)域的左上角丫坐標(biāo)nDestWidth指定繪制區(qū)域的高度nDestHeight指定

25、繪制區(qū)域的寬度KSrc矩形在DIB中的起點(diǎn)X坐標(biāo)YSrc矩形在DIB中的起點(diǎn)Y坐標(biāo)nSrcWidth指定原位圖繪制區(qū)域的左上角X坐標(biāo)nSrcHeight指定原位圖繪制區(qū)域的左上角丫坐標(biāo)pBits指向一個(gè)緩沖區(qū)的指針。這個(gè)緩沖區(qū)包含了以DIB格式描述的位 圖數(shù)據(jù);這種格式是由IpBits Info 指定的pBitsI nfo指向BITMAPINF(為兼容BMP4/5而聲明成Any),對(duì) DIB的格 式和顏色進(jìn)行描述的一個(gè)結(jié)構(gòu)UsageDIB_PAL_COLO顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選hDC設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引DIB RGB COLC顏色表包含了 RGB顏色dwRop欲進(jìn)行的光

26、柵運(yùn)算CreateDIBitm ap原型定義:HBITMAP CreateDIBitmap( HDC hDC, / han dle to device con text CONST BITMAPINFOHEADEpbmih, / pointer to bitmap size and format data DWOI :dwI nit, / i nitializatio n flag CONST VOID *lpb In it, / poi nter to nitialization data CONST BITMAPINFO *lpbmi, / pointer to bitmap color-

27、format data UINT fuUsage / color-data usage );VB聲明:Declare Fun ction CreateDIBitmap Lib "gdi32" (ByVal hDC As Lon g, lpbmihAs Any, ByVal fdwI nit As Lon g, lpb In it As An y, lpbmi As Any, ByVal fuUsage As Long) As Long說(shuō)明:將一幅與設(shè)備無(wú)關(guān)位圖的全部或部分?jǐn)?shù)據(jù)直接復(fù)制到一個(gè)設(shè)備。這個(gè)函數(shù)在設(shè)備 中定義了一個(gè)目標(biāo)矩形,以便接收位圖數(shù)據(jù)。它也在 DIB中定義了一

28、個(gè)源矩形, 以便從中提取數(shù)據(jù)返回值:執(zhí)行成功則返回掃描線的數(shù)量,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC一個(gè)設(shè)備場(chǎng)景的句柄。該場(chǎng)景用于接收位圖數(shù)據(jù)pbmihBITMAPINFOHEADE為兼容BMP4/5而聲明成 Any),對(duì)DIB的格式進(jìn) 行描述的一個(gè)結(jié)構(gòu):dwI nit如不應(yīng)對(duì)位圖數(shù)據(jù)進(jìn)行初始化,那么設(shè)為零。如設(shè)為CBM INIT表示根據(jù)lpbInit和lpbmi參數(shù)對(duì)位圖進(jìn)行初始化pbI nit指向一個(gè)緩沖區(qū)的指針。這個(gè)緩沖區(qū)包含了以DIB格式描述的位圖數(shù)據(jù);這種格式是由lpbmi指定的pbmi指向BITMAPINFQ為兼容BMP4/5而聲明成Any),對(duì)DIB的格式和顏

29、色進(jìn)行描述的一個(gè)結(jié)構(gòu)uUsageDIB_PAL_COLO顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選入hDC設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引DIB RGB COLC顏色表包含了 RGB顏色CreateDIBSection原型定義:HBITMAP CreateDIBSectio n( HDC hDC, / han die to device con text CONST BITMAPINFO *ipbmi, / pointer to structure containing bitmap size, format, and color data UINT iUsage, / color data type

30、 in dicator: RGB values or palette indexes VOID*ppvBits, / pointer to variable to receive a poin ter to the bitmap 's bit values HANDL掃Sect ion, / opti onal han dle to a file mapping object DWORdWOffset / offset to the bitmap bit values within the file mapping object );VB聲明:Declare Fun ction Cre

31、ateDIBSection Lib "gdi32" (ByVal hDC As Lon g, lpbmi As Any, ByVal iUsage As Long, ByRef ppvBits As Long, ByVal hSection As ong, ByVal dwOffset As Long) As Long說(shuō)明:CreateDIBSection 能創(chuàng)建一種特殊的 DIB,稱為DIB項(xiàng)(DIBSection ),然后返 回一個(gè)GDI位圖的句柄。它提供了 DIB和GDI位圖的最好的特性。這樣我們可以 直接訪問(wèn)DIB的內(nèi)存,可以利用位圖句柄和內(nèi)存設(shè)備環(huán)境,我們甚至還可

32、以在 DIB中調(diào)用GDI函數(shù)來(lái)繪圖返回值:執(zhí)行成功返回DIBSection位圖的句柄,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC一個(gè)設(shè)備場(chǎng)景的句柄。如dw設(shè)為DIB_PAL_COLOR那么DIB顏色表 就會(huì)用來(lái)自邏輯調(diào)色板的顏色進(jìn)行初始化pbmi指向BITMAPINFQ為兼容BMP4/5而聲明成Any),這個(gè)結(jié)構(gòu)初始化 成欲創(chuàng)建的那幅位圖的配置數(shù)據(jù)Usage顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選入hDC 一一設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引DIB RGB COLC顏色表包含了 RGB顏色ppvBits用于得到DIBSection數(shù)據(jù)區(qū)的內(nèi)存地址hSecti on指向一個(gè)文件映射對(duì)象的可

33、選句柄,位圖將在其中創(chuàng)建。如設(shè)為零,Win dows會(huì)自動(dòng)分配內(nèi)存dwOffset如指定了句柄,就用這個(gè)參數(shù)指定位圖數(shù)據(jù)在文件映射對(duì)象中的偏 移量GetDIBits原型定義:nt GetDIBits( HDChDC, / han die to device con text HBITMAPhbmp, / han dieto bitmap UINT uStartScan, / first scan line to set in destination bitmap JINT cScanLines, / number of scan lines to copy LPVOIDpvBits, / ad

34、dress of array for bitmap bits LPBITMAPINFdpbmi,/ address of structure with bitmap data UINT uUsage / RGB or palette in dex );VB聲明:Declare Function GetDIBits Lib "gdi32" (ByVal hDCAs Long, ByVal hbmpAs _ong, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, pbmi As Any, B

35、yVal uUsage As Long) As Long說(shuō)明:該函數(shù)利用申請(qǐng)到的內(nèi)存,由GDI位圖得到DIB位圖數(shù)據(jù)。通過(guò)該函數(shù),可以對(duì) DIB的格式進(jìn)行控制,可以制定顏色的位數(shù),而且可以指定是否進(jìn)行壓縮。如果 采用了壓縮方式,則必須調(diào)用該函數(shù)兩次,一次為了得到所需內(nèi)存,另外一次為 了得到位圖數(shù)據(jù)返回值:執(zhí)行成功則返回掃描線的數(shù)量,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC疋義了與設(shè)備有關(guān)位圖hBitmap的配置信息的一個(gè)設(shè)備場(chǎng)景的句柄hbmp源位圖的句柄u StartSca n欲復(fù)制到DIB中的第一條掃描線的編號(hào)cSca nLines欲復(fù)制的掃描線數(shù)量pvBits指向一個(gè)緩沖區(qū)的

36、指針。這個(gè)緩沖區(qū)包含了以DIB格式描述的位圖數(shù)據(jù);這種格式是由lpbmi指定的pbmi指向BITMAPINFQ為兼容BMP4/5而聲明成Any).對(duì)DIB的格式及 顏色進(jìn)行說(shuō)明的一個(gè)結(jié)構(gòu)。在BITMAPINFOHEAD結(jié)構(gòu)中,從biSize 到biCompression之間的所有字段都必須初始化uUsageDIB_PAL_COLO顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選入RDc設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引dib rgb colO顏色表包含了 RGB顏色SetDIBits原型定義:nt SetDIBits( HDChDC, / handle to device con text HBITMAFhb

37、mp, / han die o bitmap UINT uStartScan, / starting scan line UINT cScanLines, /number of scan lines CONST VOID *lpvBits, / array of bit map bits CONST BITMAPINFO *lpbmi, / address of structure with bitm ap data UINT uUsage / type of color indexes to use );VB聲明:Declare Function SetDIBits Lib "gd

38、i32" (ByVal hDCAs Long, ByVal hbmpAs _ong, ByVal uStartScan As Long, ByVal cScanLines As Long, lpvBits As Any, pbmi As Any, ByVal uUsage As Long) As Long說(shuō)明:將來(lái)自與設(shè)備無(wú)關(guān)位圖的二進(jìn)制位復(fù)制到一幅與設(shè)備有關(guān)的位圖里返回值:執(zhí)行成功則返回掃描線的數(shù)量,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC疋義了與設(shè)備有關(guān)位圖hBitmap的配置信息的一個(gè)設(shè)備場(chǎng)景的句柄hbmp源位圖的句柄u StartSca n欲復(fù)制到DIB中的第一

39、條掃描線的編號(hào)cSca nLines欲復(fù)制的掃描線數(shù)量pvBits指向一個(gè)緩沖區(qū)的指針。這個(gè)緩沖區(qū)包含了以DIB格式描述的位圖數(shù)據(jù);這種格式是由lpbmi指定的pbmi指向BITMAPINFQ為兼容BMP4/5而聲明成Any).對(duì)DIB的格式及 顏色進(jìn)行說(shuō)明的一個(gè)結(jié)構(gòu)。在BITMAPINFOHEADfiR勾中,從biSize 到biCompression之間的所有字段都必須初始化uUsageDIB PAL COLO-顏色表是一個(gè)整數(shù)數(shù)組,其中包含了與目前選入RDc設(shè)備場(chǎng)景的調(diào)色板相關(guān)的索引DIB RGB COLO顏色表包含了 RGB顏色GetDIBColorTable原型定義:UINT Get

40、DIBColorTable( HDChDC, / han dle to device con text whose DIB is of interest UINT uStartIndex, / color table index of first entry toetrieve UINT cEn tries, / nu mber of color table en tries to retrieve RGBQUADColors / pointer to buffer that receives color table entries );VB聲明:Declare Function GetDIB

41、ColorTable Lib "gdi32" (ByVal hDC As Long, ByVal uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUADAs Long說(shuō)明:從選入設(shè)備場(chǎng)景的DIBSection中取得顏色表信息返回值:取回的顏色條目數(shù)量,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC已選入了一個(gè)DIBSection對(duì)象的設(shè)備場(chǎng)景uStartI ndex顏色表中欲取回的第一個(gè)條目的索引cEn tries欲取回的條目數(shù)量pColors這個(gè)結(jié)構(gòu)數(shù)組用于裝載顏色表信息的第一個(gè)條目SetDI

42、BColorTable原型定義:UINT SetDIBColorTable( HDChDC, / han dle to device con text whose DIB is of in terest UINT uStart In dex, / color table in dex of first en tryto setUINT cEn tries, / number of color table en tries to set CONST RGBQUAD*pColors / poin ter to array of color table en tries );VB聲明:Declare

43、 Function SetDIBColorTable Lib "gdi32" (ByVal hDC As Long, ByVal uStartIndex As Long, ByVal cEntries As Long, pColors As RGBQUADAs Long說(shuō)明:從選入設(shè)備場(chǎng)景的DIBSection中取得顏色表信息返回值:取回的顏色條目數(shù)量,零表示失敗。會(huì)設(shè)置GetLastError參數(shù):hDC已選入了一個(gè)DIBSection對(duì)象的設(shè)備場(chǎng)景uStartI ndex顏色表中欲取回的第一個(gè)條目的索引cEn tries欲取回的條目數(shù)量pColors這個(gè)結(jié)構(gòu)數(shù)組用于裝載

44、顏色表信息的第一個(gè)條目用DIB寫圖像處理程序的時(shí)候,首先要明確一點(diǎn):DIB并不是圖像處理算法,而是一種繪圖方法。處理算法比 DIB高一級(jí),管理坐標(biāo) 和顏色的運(yùn)算;而DIB只是為了繪制。所以此時(shí)處理算法的效率是速 度的關(guān)鍵。利用DIB繪制圖像并沒(méi)有比用PSet/SetPixel繪制差多少,它只 是把坐標(biāo)運(yùn)算改成地址運(yùn)算而已。很多人知道指針是一個(gè)危險(xiǎn)的東 西,就是因?yàn)樗苤苯釉L問(wèn)內(nèi)存,如果指針不小心指錯(cuò)地方的話, Win dows立即報(bào)告一般保護(hù)性錯(cuò)誤。所以,在地址運(yùn)算的時(shí)候一定要 小心,同時(shí)要注意隨時(shí)保存,因?yàn)榇藭r(shí)的非法操作的發(fā)生率非常高, 否則辛辛苦苦寫的代碼一瞬間沒(méi)了可別怪我沒(méi)提醒啊。好了,

45、現(xiàn)在開(kāi)始!由于處理算法起指導(dǎo)作用,所以現(xiàn)在先講解 VB_PSe。所有的代 碼都在 FrmMain.frm 中。其他的過(guò)程的代碼可以不看, 現(xiàn)在將注意力 集中在“ DrawIt ”中,它就是管繪制的。其實(shí)我這個(gè)演示程序蠻簡(jiǎn)單的:R分量延著水平方向增加,G分 量延著垂直方向增加,B分量則從右往左滾動(dòng)。什么?!“And&HFF是什么意思?!這可是基礎(chǔ)啊,(下略 &HFFFF字)?!?amp;H表 示十六進(jìn)制數(shù),而And表示按位與。&HFF是二進(jìn)制的“ 1111 1111”, 正好覆蓋了低8位,這時(shí)用And進(jìn)行按位與,只會(huì)得到低8位,與 RGB分量需要的8位正好符合(對(duì)于“ J

46、 + K) And &HFF ”來(lái)說(shuō),可 以實(shí)現(xiàn)滾動(dòng)效果)。If Not 看明白了 Then Goto 前兩段好!現(xiàn)在打開(kāi)VB_DIB(由于24位能直接指定RGE分量,所以 這里是用的是 24位 DIB)看了前面的“ DIB的結(jié)構(gòu)”,是不是有點(diǎn)昏呢?其實(shí) DIB也沒(méi)什 么,就是一個(gè)表述位圖信息的BITMAPINFO吉構(gòu) 和一個(gè)存儲(chǔ)位圖數(shù) 據(jù)的數(shù)據(jù)緩沖區(qū),頂多再用 SetDIBitsToDevice 繪制,所以 VB_DIB 與 VB_PSet相比只是多了 SetDIBitsToDevice、BITMAPINFOHEADER 位DIB沒(méi)有調(diào)色板,所以用BITMAPINFOHEAD就行)和一些常數(shù)的 聲明而已。 由于這個(gè)演示程序不需要改變圖像大小和色深, 所以可以 把有關(guān)變量作為

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論