MFC中图片处理问题:怎么让图片中的白色部分设置为背景色?

MFC中图片处理问题:怎么让图片中的白色部分设置为背景色?,第1张

透明色问题,刚好我做过

先跟你说下步骤:

1、创建一张大小与需要绘制图像相同的位图作为“掩码”位图;

2、将新创建的“掩码”位图存储至掩码位图的设备描述表中;

3、把位图设备描述表的背景设置成“透明色”,即不需要显示的颜色;

4、复制粘贴位图到“掩码”位图的设备描述表中,这个时候“掩码”位图设备描述表中存放的位图与位图设备描述表中的位图一样;

5、把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或 *** 作绘制到对话框上;

6、把“掩码”位图与这个时候对话框相应区域的背景进行逻辑与的 *** 作;

7、最后一步重复步骤5的 *** 作,把需要透明绘制的位图与对话框绘图相应区域的背景进行逻辑异或 *** 作绘制到对话框上;

8、当然最后不要忘记了把系统的画笔还给系统,删除使用过的GDIObject,释放非空的指针,最后把新建的设备描述表也删除;

具体代码如下显示,这段代码只是截取了在WM_PAINT消息中对话框客户区画图的部分,位图的加载和删除分别写在OnInitDialog()函数和析构函数中;

CDC imgDC, maskDC//定义存储位图的位图设备描述表imgDC和存储掩码位图的掩码位图

//设备描述表maskDC

CRect rcWnd, rcPic

imgDC.CreateCompatibleDC(NULL)//初始化设备描述表

maskDC.CreateCompatibleDC(NULL)//初始化设备描述表

CBitmap bmpMask

BITMAP bm

m_bmpSample.GetBitmap(&bm)

GetClientRect(rcWnd)

rcPic.left = (rcWnd.Width() - bm.bmWidth)/2

rcPic.right = rcPic.left + bm.bmWidth

rcPic.top = (rcWnd.Height() - bm.bmHeight)/2

rcPic.bottom = rcPic.top + bm.bmHeight

bmpMask.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL)//初始化掩码位图

CBitmap * pOldBmp = imgDC.SelectObject(&m_bmpSample)//存储位图至位图设备描述表

CBitmap * pOldMaskBmp = maskDC.SelectObject(&bmpMask)//存储掩码位图至掩码位图

//设备描述表

imgDC.SetBkColor(RGB(255, 255, 0))//设置位图设备描述表的背景色为透明色

maskDC.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCCOPY)

dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT)

dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &maskDC, 0, 0, SRCAND)

dc.BitBlt(rcPic.left, rcPic.top, bm.bmWidth, bm.bmHeight, &imgDC, 0, 0, SRCINVERT)

imgDC.SelectObject(pOldBmp)

maskDC.SelectObject(pOldMaskBmp)

bmpMask.DeleteObject()

pOldBmp = NULL

pOldMaskBmp = NULL

DeleteDC(imgDC)

DeleteDC(maskDC)

LoadImage(AfxGetInstanceHandle(), CString("C:\\Users\\lenovo\\Desktop\\test.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)

这是你要的函数。

看一下我给你的例子,本例子是动态加载突变显示随着鼠标移动(防闪烁)。但是这个是VS2012运行的工程:

你看CDanamicLoadView::OnCreate中动态加载图片,并创建兼容DC中的代码。

在CDanamicLoadView::OnMouseMove中将加载的动态图片画到另一个虚拟DC中,将虚拟DC完全复制到兼容DC中。

OnEraseBkgnd(是一个背景重画的消息WM_ERASEBKGND,返回TRUE不重画背景)

CDanamicLoadView::OnDraw中将兼容DC中复制到pDC中。

希望你通过看我的例子能真正学到东西,这是vs2012的工程可能你没办法直接运行,也只能帮你到这里了,主要功能就看我前面几个函数中实现的代码,希望对你有帮助。

是这样的,MFC创建的窗口,在接收到“重绘”消息的时候会擦除窗口的内容并绘制控件的图案(这意味着如果你不是在重绘消息的处理函数中绘制图形,那么图形被擦除后也不会再恢复),而在其它情况下窗口是不会擦除内容并重绘的。所以如果你只是在鼠标拖拽的事件中绘制矩形的话,绘制新矩形之前旧的矩形是不会被擦掉的。然而,也不能简单地使窗口重绘来到达目的,因为那样会导致之前已经绘制好的所有图形被擦掉,最后窗口只剩下最新绘制的矩形。要达到画图的目的,你得将已绘制好的图案储存在内存中(以位图的形式),而正在绘制的矩形则只在窗口上绘制,不在内存中的位图中绘制,而当当前的图形完全确定(即松开鼠标)时,再将它绘制入内存中的位图。这样处理后,就可以在鼠标拖动过程中(需要实时删除之前的图形)放心地使窗口重绘(这会使之前的图像被擦除,不会留下痕迹),然后在重绘消息处理函数中(擦除过程由MFC框架自动完成,你的处理函数会在擦除后被调用,负责绘制图案)将内存中的图案复制到窗口上,这使得之前已经确定的图案重新被显示。最后再向窗口中绘制当前还未确定的图形。至于具体实现,主要途径就是创建内存画布,网页搜索“MFC双缓冲绘图”,你会得到通过暂时在内存中绘图,最后再向屏幕复制图案以防止重绘时窗口闪烁的方法,在它的基础上稍加改动(例如将位图对象从临时改为全局以保留图像,请结合自己的思考修改其它部分)即可实现画图的功能。过程中请务必记住,窗口上的图像很容易就会因遮挡或重绘而消失,而且不方便针对性地删除某一个与其它图案重叠的图形,所以需要在内存中保存你希望保存的图像。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7811225.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存