日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用GetDIBts/SetDIBits高速逐点处理 from http://blog.sina.com.cn/s/blog_552ad2090100e3eu.html...

發布時間:2023/12/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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。
//1.創建雙緩存,創建DIB
//HDC hdc,memdc, HBITMAP memBmp為成員變量

hdc=::GetDC(m_hWnd);
memdc=CreateCompatibleDC(hdc);
memBmp=CreateCompatibleBitmap(hdc,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
SelectObject(memdc,memBmp);
//CImage *img為成員變量 #include <atlimage.h>
img=new CImage();
img->Load(_T("3.bmp"));
img->Draw(memdc,0,0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),0,0,img->GetWidth(),img->GetHeight());
//從HBITMAP獲取BITMAP
CBitmap cbmp;
cbmp.Attach(memBmp);
cbmp.GetBitmap(&bm);
//創建DIB實際上就兩步
//1. 在內存new出一片位圖大小的空間,new BYTE,new char,GlobalAlloc都有人用
//2. 填寫BITMAPINFO結構

DWORD size=bm.bmWidthBytes*bm.bmHeight;?//每行像素位*圖高
pBuf=new BYTE[size];
????
??
ZeroMemory(&binfo,sizeof(BITMAPINFO));
binfo.bmiHeader.biBitCount=bm.bmBitsPixel;??????//每個像素多少位,也可直接寫24(RGB)或者32(RGBA)
binfo.bmiHeader.biCompression=0;
binfo.bmiHeader.biHeight=bm.bmHeight;
binfo.bmiHeader.biPlanes=1;
binfo.bmiHeader.biSizeImage=0;
binfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
binfo.bmiHeader.biWidth=bm.bmWidth;
//下面就可以逐點處理了
//獲取位圖到內存DIB
GetDIBits(memdc,memBmp,0,binfo.bmiHeader.biHeight,pBuf,(BITMAPINFO*)&binfo,DIB_RGB_COLORS);
//逐點處理,這里是用來作淡出效果
//這里是一個顏色分量8位,而不是一個像素
for(int i=0;i<binfo.bmiHeader.biSizeImage;i++)
{
???pBuf[i]=pBuf[i]*level/256;
??
}

//全圖處理完畢讀出到屏幕dc顯示
SetDIBits(hdc,memBmp,0,binfo.bmiHeader.biHeight,pBuf,(BITMAPINFO*)&binfo,DIB_RGB_COLORS);

原來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...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。