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 }
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 }