已得到hbitmap句柄,然后怎么通过该句柄从内存中读取图像并显示出来

蓝天上的白云 2013-07-29 08:47:45
在VC++中,假设现在已得到位图hbitmap的句柄,问题如下有二:

1、如何通过该句柄把该图形写内存?
2、如何通过该句柄从内存读取图形?

问题比较急,希望各位大侠给些指点,感激万分,希望不要随便找的粘贴过来,谢谢!
...全文
358 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvcmc 2013-08-01
  • 打赏
  • 举报
回复
int GetDIBits( HDC hdc, // handle to DC HBITMAP hbmp, // handle to bitmap UINT uStartScan, // first scan line to set UINT cScanLines, // number of scan lines to copy LPVOID lpvBits, // array for bitmap bits LPBITMAPINFO lpbi, // bitmap data buffer UINT uUsage // RGB or palette index); lpvBits 就是图像数据
smwhotjay 2013-07-30
  • 打赏
  • 举报
回复
2、如何通过该句柄从内存读取图形? // 获取hbitmap的相关数据 比如位图阵列 GetDIBits(hdc, hBitmap, 0, (UINT) bitmap.bmHeight, 1、如何通过该句柄把该图形写内存? 参照Tofile函数 把写入硬盘改为写到内存.即可

//把屏幕内容以位图格式存到磁盘文件上
//lpfilename 为位图文件名,hbitmap 为刚才的屏幕位图句柄
int Tofile(HBITMAP hbitmap , LPSTR lpfilename)
{ 
	HDC hdc; //设备描述表
		int ibits; 
	WORD wbitcount; 	//当前显示分辨率下每个像素所占字节数
	
		//位图中每个像素所占字节数,定义调色板大小,位图中像素字节大小,位图文件大小 ,写入文件字节数
	DWORD dwpalettesize=0, dwbmbitssize, dwdibsize, dwwritten;

	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 if (ibits <= 16)
			wbitcount = 16;
	else if (ibits <= 24)
			wbitcount = 24;
	else 
			wbitcount = 32;

	//计算调色板大小
		if (wbitcount <= 8)
			dwpalettesize = (1 << wbitcount) * sizeof(RGBQUAD);

	//设置位图信息头结构
	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.biClrUsed = 0;
	bi.biClrImportant = 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(lpfilename, 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;
}
向立天 2013-07-30
  • 打赏
  • 举报
回复
试试CBitmap的FromHandle

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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