如何将当前视图的图像保存为Bitmap

hua2136 2007-12-25 05:59:44
我的工程是单文档的,在视图上有幅图像,如何才能保存为Bitmap格式的?
试了好多次就是不成...
...全文
227 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
appleboyecho 2007-12-26
  • 打赏
  • 举报
回复
嗯,楼上给出的即是正确解答。
mynamelj 2007-12-26
  • 打赏
  • 举报
回复

//-------------------------------------------------------------
// Function : GetWindowBitmap
// Description : Copy a block bitmap from the window
// or screen Specifies location
// Paratmeters :
//-------------------------------------------------------------
HBITMAP GetWindowBitmap(HWND hwnd, LPRECT lpRect)
{
if( !lpRect )
return NULL;

HDC hDC;
HDC hMemDC;
HBITMAP hBitmap = NULL;
HBITMAP hOldBitmap;

// Get window or screen DC
if( hwnd == NULL )
hDC = GetDC(HWND_DESKTOP);
else
hDC = GetWindowDC(hwnd);

if( hDC == NULL )
return NULL;

hMemDC = CreateCompatibleDC(hDC);
hBitmap = CreateCompatibleBitmap(hDC, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top);
if( hBitmap == NULL)
return NULL;

hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, lpRect->right - lpRect->left, lpRect->bottom - lpRect->top, hDC, lpRect->left, lpRect->top, SRCCOPY);

SelectObject(hMemDC, hOldBitmap);
DeleteDC(hMemDC);
ReleaseDC(hwnd, hDC);

return hBitmap;
}
Yofoo 2007-12-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/zzz3265/archive/2007/12/26/1967478.aspx

参看函数 SaveWindowToBMP
hua2136 2007-12-25
  • 打赏
  • 举报
回复
help
pzhuyy 2007-12-25
  • 打赏
  • 举报
回复
mark.
hua2136 2007-12-25
  • 打赏
  • 举报
回复
help
hua2136 2007-12-25
  • 打赏
  • 举报
回复
我是这样写的,
//
CClientDC dc(this);
hdc = dc.m_hDC;
hdcMem = CreateCompatibleDC(hdc);
hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
SaveBmp02( hBitMap, _T("E:\\RRR.bmp") );
return;

但是不行,只有一个BMP文件生成了,没有图像
hua2136 2007-12-25
  • 打赏
  • 举报
回复
TO appleboyecho :

如果调用你的接口:
HBITMAP 参数如何设定才可以保证是当前视图的内容?
my_girlf 2007-12-25
  • 打赏
  • 举报
回复
CDC *pDC;
CDIB *pSRC;
pDC=pSRC->BeginPaint(NULL);
..........
pSRC->EndPaint();
pSRC->Save("c:/a.bmp");
appleboyecho 2007-12-25
  • 打赏
  • 举报
回复
给你一段代码:
BOOL SaveBmp(HBITMAP hBitmap, CString FileName)
{
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 }
appleboyecho 2007-12-25
  • 打赏
  • 举报
回复
网上有好多贴子的搜一下就可以了应该,主要是格式问题应该。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧