BYTE和CBitmap之间的转换

博客讲述了在C++中如何将CBitmap对象的像素数据转换为BYTE数组,以及反向将BYTE数组转换回CBitmap的过程。作者在转换过程中遇到了初始化问题,发现使用CBitmap指针会导致错误,而改为使用CBitmap变量则可以解决问题。对于更复杂的图像转换,建议使用BITMAPINFO结构和CreateDIBSection来确保数据准确无误。
摘要由CSDN通过智能技术生成
 

        其实是件很简单的事情,结果搞了一个下午,原因就是一个小小的细节,唉,总是败在这上面。。。

        首先,从CBitmap中提取像素数据赋值给BYTE类型,代码如下:

	CBitmap Bmp;//背景图片
	Bmp.LoadBitmap(IDB_BITMAP1);//从资源中载入BMP位图
	Bmp.GetBitmap(&bm);   //获得位图大小结构
	long sizeByte = bm.bmHeight * bm.bmWidth * 4;  //计算像素数据大小,因为是32位图,所以*4,如果是24位,则*3
	BYTE *pBmpBuffer = new BYTE[sizeByte]; 
         memset(pBmpBuffer, 0, sizeByte);//初始化内存指针
	Bmp.GetBitmapBits(sizeByte, pBmpBuffer);//复制像素数据


 

然后是BYTE转换为CBitmap,代码如下:

CBitmap bkBmp;

CDC *pDC = GetDC();

 long sizeByte = bkHeight * bkWidth * 4;
 bkBmp.CreateCompatibleBitmap(pDC,bkWidth,bkHeight);//初始化图形,否则没有文件头
 bkBmp.SetBitmapBits(sizeByte,pImg);//复制像素数据


我在初始化图像那里卡了好久。。。因为自己定义的CBitmap变量是一个CBitmap类型指针,然后我就


                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
下面是将一张24位图转换成单色位图的 MFC 代码: 1. 创建一个 CBitmap 对象,加载原始的 24 位图: CBitmap bmp; bmp.LoadBitmap(IDB_24BITMAP); 2. 获取原始位图的宽度和高度: BITMAP bmpInfo; bmp.GetBitmap(&bmpInfo); int width = bmpInfo.bmWidth; int height = bmpInfo.bmHeight; 3. 创建一个与原始位图相同大小的单色位图: CBitmap monoBmp; monoBmp.CreateBitmap(width, height, 1, 1, NULL); 4. 为单色位图创建一个 CDC 对象: CDC monoDC; monoDC.CreateCompatibleDC(NULL); 5. 将单色位图选入 CDC 对象: CBitmap* pOldBmp = monoDC.SelectObject(&monoBmp); 6. 将原始位图绘制到单色位图上,并使用 SetPixel 来将每个像素设置为黑色或白色: CDC bmpDC; bmpDC.CreateCompatibleDC(NULL); CBitmap* pOldBmp2 = bmpDC.SelectObject(&bmp); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { COLORREF color = bmpDC.GetPixel(x, y); BYTE r = GetRValue(color); BYTE g = GetGValue(color); BYTE b = GetBValue(color); BYTE gray = (BYTE)((r + g + b) / 3); if (gray > 128) { monoDC.SetPixel(x, y, RGB(255, 255, 255)); } else { monoDC.SetPixel(x, y, RGB(0, 0, 0)); } } } 7. 将 CDC 对象中的单色位图保存到文件: monoBmp.SaveBMP(_T("mono.bmp")); 8. 释放对象: bmpDC.SelectObject(pOldBmp2); monoDC.SelectObject(pOldBmp); 注意:这段代码只能将 24 位图转换成黑白单色位图,如果您需要将其转换成灰度单色位图,可以使用不同的算法来计算每个像素的灰度值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值