使用GetDIBts/SetDIBits高速逐点处理 from http://blog.sina.com.cn/s/blog_552ad2090100e3eu.html...
使用GetDIBts/SetDIBits高速逐點處理
?(2009-07-30 14:38:03) 轉載▼標簽:? 雜談 | ? |
| 之前逐點處理像素的時候都用GetPixel和SetPixel,對比了下坂本千尋系列里用的DIB,才知道那速度真不是一般的慢。前者可以看到掃描線,處理一張1024*800的圖需要1~2s,但是后者處理相同大小的圖幾乎是即時的。 關于DIB(設備無關位圖)和DDB(設備相關位圖)有很多概念,經常弄得我云里霧里,實際上用起來,DDB就是和dc相關的位圖,不同情況下用CreateBMP(),CreateCompatibleBMP(),LoadBMP(),LoadImage()等創建的就是DDB。DIB就是一片內存,里面存儲著位圖掐頭去尾,只留下RGB(32位真彩,16位真彩),或者像素+色板(8位)的信息。 創建DIB也比較暈,坂本千尋系列里,讀bmp,png,讀像素點等函數都是自己寫的。但是現在讀寫圖片有很多好用的庫,應該好好利用。所以,我的方法是,用CImage類讀圖->創建雙緩存->讀圖到離屏dc->讀內存bmp到DIB->GetDIBits->處理像素點->SetDIBits到屏幕dc。 原來DIB就是這么簡單。 ? ? SetDIBits函數功能該函數使用指定的DIB位圖中發現的顏色數據來設置位圖中的像素。函數原型int SetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits,CONST BITMAPINFO *lpbmi, UINT fuColorUse);參數hdc:指向設備環境中的句柄。 hbmp:指向位圖的句柄。函數要使用指定DIB中的顏色數據對該位圖進行更改。 uStartScan:為參數lpvBits指向的數組中的、與設備無關的顏色數據指定起始掃描線。 cScanLines:為包含與設備無關的顏色數據的數組指定掃描線數目。 lpvBits:指向DIB顏色數據的指針,這些數據存儲在字節類型的數組中,位圖值的格式取決于參數lpbmi指向的BITMAPINFO結構中的成員biBitCount。 lpbmi:指向BITMAPINFO數據結構的指針,該結構包含有關DIB的信息。 fuColorUse:指定是否提供了BITMAPINFO結構中的bmiColors成員,如果提供了,那么bmiColors是否包含了明確的RGB值或調色板索引。參數fuColorUse必須取下列值,各值的含義為: DIB_PAL_COLORS:顏色表由16bit的索引值數組組成。這些值可以對由hdc參數標識的設備環境中的邏輯調色板進行索引。 DIB_RGB_COLORS:提供了顏色表,并且表中包含了原義的RGB值。返回值如果函數成功,那么返回值就是復制的掃描線數;如果函數失敗,那么返回值是0。 Windows NT:若想獲得更多錯誤信息,請調用GetLastError函數。備注當位圖的位要索引到系統調色板時,可獲取最佳的位圖繪制速度。 應用程序可能通過調用GetSystemPaletteEntries函數來檢索系統調色板顏色和索引。在檢索到顏色和索引值之后,應用程序可以創建DIB,有關更多的信息,請參考系統調色板(System Paletle)。 只有在參數fuColorUse設置為DIB_PAL_COLORS常量時才使用參數hdc標識的設備環境,否則會忽略hdc參數中的值。 在應用程序調用該函數時,必須把由參數hbmp標識的位圖選入到設備環境中。 自底向上的DIB位圖的起始點是該位圖的左下角處,自頂向下的DIB位圖的起源點在該位圖的左上角處。 ICM:顏色管理照樣進行。如果指定的BITMAPINFO結構不是BITMAPV4HEADER或BITMAPV5HEADER,那么當前設備環境的顏色配置(profile)就用作源顏色配置。如果BITMAPINFO結構不是BITMAPV4HEADER或BITMAPV5HEADER,那么使用RGB顏色。如果指定的BITMAPINFO結構是BITMAPV4HEADER或BITMAPV5HEADER,那么與該位圖有關的顏色配置(profile)被用作源顏色。 速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;頭文件:wingdi.h:庫文件:gdi32.lib。? |
轉載于:https://www.cnblogs.com/songtzu/archive/2012/12/21/2828295.html
總結
以上是生活随笔為你收集整理的使用GetDIBts/SetDIBits高速逐点处理 from http://blog.sina.com.cn/s/blog_552ad2090100e3eu.html...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 往对象数组里面添加相同的key 不同的v
- 下一篇: Servlet的入门