不用mfc的方法,从dc中取出图象数据


 
 2004.8.30 
 
 
 

CSDN - 技术社区 - VC/MFC 图形处理/算法问题  

主  题:  不用mfc的方法,从dc中取出图象数据(做旋转用) 
作  者:  yuga (常来看看) 
等  级:   
信 誉 值:  122 
所属社区:  VC/MFC 图形处理/算法 
问题点数:  100 
回复次数:  7 
发表时间:  2004-8-30 11:25:27 
  
 
  

for(int i=0;i<m_layers.GetLayerCount();i++)
 {
  pLayer=m_layers.GetItem(i);   
   DrawLayer(hdcTemp,pLayer,*GetTrackRect1());
   DrawLayer(hdcTemp,pLayer,*GetTrackRect2());
   BitBlt(hdc,0,0,w,h,hdcTemp,0,0,SRCCOPY);

 }
一层一层画出了dc
HBITMAP GetSrcBit(HDC hDC,int BitWidth, int BitHeight)
{
 HDC hBufDC;
 HBITMAP hBitmap, hBitTemp;
 hBufDC = CreateCompatibleDC(hDC);
 hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
 hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
 StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
 hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
 hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);
 DeleteObject(hBitTemp);
 ::DeleteDC(hBufDC);
 return hBitmap;
}得到了hBitmap
BITMAP bm;
    GetObject(hBitmap, sizeof(bm), &bm);
这时bm.bmBits是NULL,无法找到它所对应的位图数据

 
  回复人: lixiaosan(小三) ( ) 信誉:140  2004-8-30 11:31:23  得分: 0 
 
 
  
http://www.yesky.com/SoftChannel/72342380468174848/20040301/1772782_1.shtml

 
 
Top 
 
 回复人: yuga(常来看看) ( ) 信誉:122  2004-8-30 11:33:52  得分: 0 
 
 
  
mfc都不用,更别说.net了
win32的方法

 
 
Top 
 
 回复人: lanstar200(玛雅哥布林) ( ) 信誉:105  2004-8-30 12:54:43  得分: 0 
 
 
  
http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=184737

 
 
Top 
 
 回复人: lanstar200(玛雅哥布林) ( ) 信誉:105  2004-8-30 13:00:10  得分: 0 
 
 
  
HBITMAP GetSrcBit(HDC hDC,DWORD BitWidth, DWORD BitHeight)
{
 HDC hBufDC;
 HBITMAP hBitmap, hBitTemp;

 //创建设备上下文(HDC)
 hBufDC = CreateCompatibleDC(hDC);

 //创建HBITMAP
 hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
 hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);
 
 //得到位图缓冲区
 StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
   hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);

 //得到最终的位图信息
 hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

 //释放内存

 DeleteObject(hBitTemp);
 ::DeleteDC(hBufDC);

 return hBitmap;
}

BOOL SaveBmp(HBITMAP hBitmap, LPSTR FileName)
{
 //设备描述表
 HDC hDC;
 //当前分辨率下每象素所占字节数
 int iBits;
 //位图中每象素所占字节数
 WORD wBitCount;
 //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
 DWORD dwPaletteSize=0, dwBmBitsSize=0, dwDIBSize=0, dwWritten=0;
 //位图属性结构
 BITMAP Bitmap; 
 //位图文件头结构
 BITMAPFILEHEADER bmfHdr; 
 //位图信息头结构
 BITMAPINFOHEADER bi; 
 //指向位图信息头结构 
 LPBITMAPINFOHEADER lpbi; 
 //定义文件,分配内存句柄,调色板句柄
 HANDLE fh, hDib, hPal,hOldPal=NULL;
 
 //计算位图文件每个像素所占字节数
 hDC = CreateDC("DISPLAY", NULL, NULL, NULL);
 iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
 DeleteDC(hDC);
 if (iBits <= 1)  wBitCount = 1;
 else if (iBits <= 4)  wBitCount = 4;
 else if (iBits <= 8)  wBitCount = 8;
 else      wBitCount = 24;
 
 GetObject(hBitmap, sizeof(Bitmap), (LPSTR)&Bitmap);
 bi.biSize   = sizeof(BITMAPINFOHEADER);
 bi.biWidth   = Bitmap.bmWidth;
 bi.biHeight   = Bitmap.bmHeight;
 bi.biPlanes   = 1;
 bi.biBitCount  = wBitCount;
 bi.biCompression = BI_RGB;
 bi.biSizeImage  = 0;
 bi.biXPelsPerMeter = 0;
 bi.biYPelsPerMeter = 0;
 bi.biClrImportant = 0;
 bi.biClrUsed  = 0;
 
 dwBmBitsSize = ((Bitmap.bmWidth * wBitCount + 31) / 32) * 4 * Bitmap.bmHeight;
 
 //为位图内容分配内存
 hDib = GlobalAlloc(GHND,dwBmBitsSize + dwPaletteSize + sizeof(BITMAPINFOHEADER));
 lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
 *lpbi = bi;

 // 处理调色板 
 hPal = GetStockObject(DEFAULT_PALETTE);
 if (hPal)
 {
  hDC = ::GetDC(NULL);
  hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
  RealizePalette(hDC);
 }

 // 获取该调色板下新的像素值
 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
   +dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);
 
 //恢复调色板 
 if (hOldPal)
 {
  ::SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
  RealizePalette(hDC);
  ::ReleaseDC(NULL, hDC);
 }

 //创建位图文件 
 fh = CreateFile(FileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS,
     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
 
 if (fh == INVALID_HANDLE_VALUE)  return FALSE;
 
 // 设置位图文件头
 bmfHdr.bfType = 0x4D42; // "BM"
 dwDIBSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize; 
 bmfHdr.bfSize = dwDIBSize;
 bmfHdr.bfReserved1 = 0;
 bmfHdr.bfReserved2 = 0;
 bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + dwPaletteSize;
 // 写入位图文件头
 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
 // 写入位图文件其余内容
 WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);
 //清除 
 GlobalUnlock(hDib);
 GlobalFree(hDib);
 CloseHandle(fh);

 return TRUE;
}

 

 
 
Top 
 
 回复人: yuga(常来看看) ( ) 信誉:122  2004-8-30 14:46:05  得分: 0 
 
 
  
windows CE 下GetDIBits没法用
就是为这个烦恼

 
 
Top 
 
 回复人: yuga(常来看看) ( ) 信誉:122  2004-8-30 14:48:19  得分: 0 
 
 
  
我是在dc上直接画出的
想获取数据
GetObject也不行bm.bmBits为空

 
 
Top 
 
 回复人: linaren(迷茫DotNet) ( ) 信誉:91  2004-8-30 14:58:04  得分: 0 
 
 
  
:)
楼上的代码我见过n遍了

 
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值