//獲取HBITMAP的位圖信息
PBITMAPINFO CreateBitmapInfoStruct(HWND HWND,HBITMAP hBmp)
{
位圖bmp
PBITMAPINFO pbmi
WORD cClrBits
//檢索位圖顏色格式、寬度和高度。
如果(!GetObject(hBmp,sizeof(BITMAP),(LPSTR)& amp;bmp))
errhandler("GetObject ",hwnd);
//將顏色格式轉換為位數。
cClrBits =(WORD)(BMP . BMP planes * BMP . bmbitspixel);
if (cClrBits == 1)
cClrBits = 1;
else if(cClrBits & lt;= 4)
cClrBits = 4;
else if(cClrBits & lt;= 8)
cClrBits = 8;
else if(cClrBits & lt;= 16)
cClrBits = 16;
else if(cClrBits & lt;= 24)
cClrBits = 24
else cClrBits = 32
//為BITMAPINFO結構分配內存。(這個結構
//包含BITMAPINFOHEADER結構和RGBQUAD數組
//數據結構。)
if (cClrBits!= 24)
pbmi =(PBITMAPINFO)local alloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD)*(1 & lt;& ltcClrBits));
//沒有適用於每像素24位格式的RGBQUAD數組。
其他
pbmi =(PBITMAPINFO)local alloc(LPTR,
sizeof(BITMAPINFOHEADER));
//初始化BITMAPINFO結構中的字段。
pbmi->;BMI header . bisize = sizeof(BITMAPINFOHEADER);
pbmi->;BMI header . bi width = BMP . BM width;
pbmi->;BMI header . BIH height = BMP . BM height;
pbmi->;BMI header . bi planes = BMP . BM planes;
pbmi->;BMI header . bibitcount = BMP . bmbitspixel;
if(cClrBits & lt;24)
pbmi->;BMI header . biclrused =(1 & lt;& ltcClrBits);
//如果位圖沒有壓縮,設置BI_RGB標誌。
pbmi->;BMI header . BI compression = BI _ RGB;
//計算顏色數組中的字節數
//索引並將結果存儲在biSizeImage中。
//對於Windows NT,寬度必須與DWORD對齊,除非
//位圖是RLE壓縮的。這個例子說明了這壹點。
//對於Windows 95/98/Me,寬度必須是字對齊的,除非
//位圖是RLE壓縮的。
pbmi->;BMI header . bisize image =((pbmi-& gt;BMI header . bi width * cClrBits+31)& amp;~31) /8
* pbmi->;BMI header . BIH height;
//將biClrImportant設置為0,指示所有
//設備顏色很重要。
pbmi->;BMI header . biclr important = 0;
返回pbmi
}
//將HBITMAP保存到文件中
void CreateBMPFile(HWND hwnd,LPTSTR pszFile,PBITMAPINFO pbi,
HBITMAP hBMP,HDC hDC)
{
處理HF;//文件句柄
BITMAPFILEHEADER hdr//位圖文件頭
PBITMAPINFOHEADER pbih//位圖信息頭
LPBYTE lpBits//內存指針
DWORD dwTotal//字節總數
DWORD cb//字節的增量計數
字節* hp//字節指針
DWORD dwTmp
pbih =(PBITMAPINFOHEADER)pbi;
LP bits =(LP byte)global alloc(GMEM _ FIXED,pbih-& gt;bisize image);
如果(!lpBits)
errhandler("GlobalAlloc ",hwnd);
//檢索顏色表(RGBQUAD數組)和位
//(調色板索引數組)。
如果(!GetDIBits(hDC,hBMP,0,(WORD)pbih-& gt;biHeight,lpBits,pbi,
DIB_RGB_COLORS))
{
errhandler("GetDIBits ",hwnd);
}
//創建。BMP文件。
hf = CreateFile(pszFile,
泛型_READ |泛型_WRITE,
(DWORD) 0,
空,
創建_總是,
文件_屬性_正常,
(句柄)NULL);
if (hf ==無效句柄值)
errhandler("CreateFile ",hwnd);
HDR . BF type = 0x4d 42;// 0x42 = "B" 0x4d = "M "
//計算整個文件的大小。
HDR . bfsize =(DWORD)(sizeof(bitmapfile header)+
pbih->;biSize+pbih->;雙色的
* sizeof(RGBQUAD)+pbih-& gt;bisize image);
HDR . bfreserved 1 = 0;
HDR . bfreserved 2 = 0;
//計算顏色索引數組的偏移量。
HDR . bfoff bits =(DWORD)sizeof(bitmapfile header)+
pbih->;biSize+pbih->;雙色的
* sizeof(RGBQUAD);
//將BITMAPFILEHEADER復制到。BMP文件。
如果(!WriteFile(hf,(LPVOID)和amphdr,sizeof(BITMAPFILEHEADER),
(lpd word)& amp;dwTmp,NULL))
{
errhandler("WriteFile ",hwnd);
}
//將BITMAPINFOHEADER和RGBQUAD數組復制到文件中。
如果(!WriteFile(hf,(LPVOID) pbih,sizeof(BITMAPINFOHEADER)
+pbih->;biClrUsed * sizeof (RGBQUAD),
(lpd word)& amp;dwTmp,(空)))
errhandler("WriteFile ",hwnd);
//將顏色索引數組復制到。BMP文件。
dw total = CB = pbih-& gt;biSizeImage
hp = lpBits
如果(!WriteFile(hf,(LPSTR) hp,(int) cb,(lpd word)amp;dwTmp,NULL))
errhandler("WriteFile ",hwnd);
//關閉。BMP文件。
如果(!關閉手柄(高頻))
errhandler("CloseHandle ",hwnd);
//釋放內存。
global free((h global)LP bits);
}
-
更改位圖意味著將位圖加載到設備中,繪制位圖,最後再次保存設備位圖。
LZ想怎麽改位圖?
-
修改位圖補充:
在應用程序的OnPaint中添加以下代碼來繪制位圖。
void cxxxx::OnPaint()
{
CBitmap bmp
如果(bmp。attach((hbit map)::LoadImage(AfxGetApp()-& gt;M _ hinstance,_ t("。\ \ bmptest.bmp "),image _ bitmap,0,0,lr _ Load from file))//從文件中加載位圖。這個要放到程序初始化中,bmp作為成員變量避免重復加載,不過我懶得寫那麽多了。
{
CPaintDC dc(這個);
CDC memDC
memDC。CreateCompatibleDC(& amp;DC);//創建內存DC
CBitmap *pOldbmp = memDC。選擇對象(& ampBMP);//將位圖加載到內存DC
CRect rc
GetClientRect(RC);//獲取客戶區大小。如果需要繪制整個位圖,可以根據需要進行修改。
華盛頓。BitBlt(0,0,rc。寬度(),rc。Height(),& ampmemDC,0,0,SRCCOPY);//在窗口上繪制位圖。
華盛頓。SetPixel(10,10,RGB(0,0,255));//在指定位置畫壹個藍點。
memDC。select object(pol dbmp);//釋放
}
}
在任壹命令中編寫以下操作碼來保存位圖。
void cxxxx::on command xxxx()
{
CClientDC dc(這個);
CRect rcClient
GetClientRect(RC client);//取客戶區大小
CDC memDC
memDC。CreateCompatibleDC(& amp;DC);//創建內存DC
CBitmap bmp
bmp。CreateCompatibleBitmap(& amp;dc,rcClient。Width(),rcClient。height());//創建壹個內存位圖,大小剛好能放下客戶區的內容,在這裏按需修改。
CBitmap *pOldBmp = memDC。選擇對象(& ampBMP);
memDC。BitBlt(0,0,rcClient。Width(),rcClient。Height(),& ampdc,0,0,SRCCOPY);//將窗口內容繪制到內存位圖上。
//在這裏,上面給出的兩個函數用於將位圖保存到壹個文件中。
PBITMAPINFO pbmi = CreateBitmapInfoStruct(GetSafeHwnd(),BMP);//建立位圖信息
CreateBMPFile(GetSafeHwnd(),_T("。\\bmptest.bmp ")、pbmi、bmp、memDC);//將位圖保存到文件中
local free(pbmi);//因為pbmi是創建函數分配的,所以需要調用者釋放。
memDC。select object(pol dbmp);//釋放內存位圖
}