首页
IT
登录
6mi
u
盘
搜
搜 索
IT
怎么样把CDC上的一个图保存为bmp格式的图
怎么样把CDC上的一个图保存为bmp格式的图
xiaoxiao
2025-10-15
2
001
HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
002
{
003
HDC hBufDC;
004
HBITMAP hBitmap, hBitTemp;
005
//创建设备上下文(HDC)
006
hBufDC = CreateCompatibleDC(hDC);
007
//创建HBITMAP
008
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
009
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
010
//得到位图缓冲区
011
StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
012
//得到最终的位图信息
013
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);
014
//释放内存
015
DeleteObject(hBitTemp);
016
::DeleteDC(hBufDC);
017
return
hBitmap;
018
}
019
BOOL
SaveBmp(HBITMAP hBitmap, CString FileName)
020
{
021
//设备描述表
022
HDC hDC;
023
//当前分辨率下每象素所占字节数
024
int
iBits;
025
//位图中每象素所占字节数
026
WORD wBitCount;
027
//定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
028
DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
029
//位图属性结构
030
BITMAP Bitmap;
031
//位图文件头结构
032
BITMAPFILEHEADER bmfHdr;
033
//位图信息头结构
034
BITMAPINFOHEADER bi;
035
//指向位图信息头结构
036
LPBITMAPINFOHEADER lpbi;
037
//定义文件,分配内存句柄,调色板句柄
038
HANDLE fh, hDib, hPal,hOldPal=NULL;
039
//计算位图文件每个像素所占字节数
040
hDC = CreateDC(
"DISPLAY"
, NULL, NULL, NULL);
041
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
042
DeleteDC(hDC);
043
if
(iBits <= 1) wBitCount = 1;
044
else
if
(iBits <= 4) wBitCount = 4;
045
else
if
(iBits <= 8) wBitCount = 8;
046
else
wBitCount = 24;
047
GetObject(hBitmap,
sizeof
(Bitmap), (LPSTR)&Bitmap);
048
bi.biSize =
sizeof
(BITMAPINFOHEADER);
049
bi.biWidth = Bitmap.bmWidth;
050
bi.biHeight = Bitmap.bmHeight;
051
bi.biPlanes = 1;
052
bi.biBitCount = wBitCount;
053
bi.biCompression = BI_RGB;
054
bi.biSizeImage = 0;
055
bi.biXPelsPerMeter = 0;
056
bi.biYPelsPerMeter = 0;
057
bi.biClrImportant = 0;
058
bi.biClrUsed = 0;
059
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
060
//为位图内容分配内存
061
hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize +
sizeof
(BITMAPINFOHEADER));
062
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
063
*lpbi = bi;
064
// 处理调色板
065
hPal = GetStockObject(DEFAULT_PALETTE);
066
if
(hPal)
067
{
068
hDC = ::GetDC(NULL);
069
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal,
FALSE
);
070
RealizePalette(hDC);
071
}
072
// 获取该调色板下新的像素值
073
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi +
sizeof
(BITMAPINFOHEADER)
074
+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
075
//恢复调色板
076
if
(hOldPal)
077
{
078
::SelectPalette(hDC, (HPALETTE)hOldPal,
TRUE
);
079
RealizePalette(hDC);
080
::ReleaseDC(NULL, hDC);
081
}
082
//创建位图文件
083
fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
084
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
085
if
(fh == INVALID_HANDLE_VALUE)
return
FALSE
;
086
// 设置位图文件头
087
bmfHdr.bfType = 0x4D42;
// "BM"
088
dwDIBSize =
sizeof
(BITMAPFILEHEADER) +
sizeof
(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
089
bmfHdr.bfSize = dwDIBSize;
090
bmfHdr.bfReserved1 = 0;
091
bmfHdr.bfReserved2 = 0;
092
bmfHdr.bfOffBits = (DWORD)
sizeof
(BITMAPFILEHEADER) + (DWORD)
sizeof
(BITMAPINFOHEADER) + dwPaletteSize;
093
094
// 写入位图文件头
095
WriteFile(fh, (LPSTR)&bmfHdr,
sizeof
(BITMAPFILEHEADER), &dwWritten, NULL);
096
// 写入位图文件其余内容
097
// WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL); //清除
098
GlobalUnlock(hDib);
099
GlobalFree(hDib);
100
CloseHandle(fh);
101
return
TRUE
;
102
}
转载请注明原文地址: https://ju.6miu.com/read-1303192.html
最新回复
(
0
)