我想把一幅位图存为gif图,当然前提是位图很简单,颜色也很少,我用GDI+中的Bitmap可以保存为gif图,但是不知道怎么设置透明色,请各位仁者见仁,智者见智啦!
解决方案 »
- WIN7的UAC限制下,QQ和工行安全控件怎么防范键盘钩子的?
- 请教关于vc++6.0下listctrl控件的问题
- 使用std::list和sort方法编译时提示如下错误。
- 如何向outlook express发件箱中加一封邮件
- 求助:CSocket(或CAsyncSocket)中,Accept和OnAccept是谁触发了谁?
- 大家帮我拿拿主意 顶的有分
- 关于窗体分割后添加listctrl的问题
- 無緣無故﹐我的信譽分少了兩點﹐可用分卻多了兩點
- 我新建了一个dialog,我想让他在程序一开始出现
- 一个菜问题!
- 如何使list ctrl中出现的表一样格式的数据能平均分它的宽度,使得数据一开始出现像表一样的,而不是使很多列的数据看不到,在线等
- vc 工程的语言转换
Windows98下的TransparentBlt会产生资源泄漏,所以不建议在WIN98下使用该函数。
TransparentBlt函数原型如下: BOOL TransparentBlt(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int hHeightDest, // 目标高度HDC hdcSrc, // 源DCint nXOriginSrc, // 源X起点int nYOriginSrc, // 源Y起点int nWidthSrc, // 源宽度int nHeightSrc, // 源高度UINT crTransparent // 透明色,COLORREF类型);使用示例: CBitmap FootballBMP;FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);CDC ImageDC;ImageDC.CreateCompatibleDC(pDC);CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));ImageDC.SelectObject(pOldImageBMP);二、实现TransparentBlt函数为了理解具有透明色位图的绘制过程,我们来亲手建立一个具有同TransparentBlt功能一致的实验函数,称之为TransparentBlt2。实验素材:有两张位图:bk.bmp是背景位图,football.bmp包含透明区域,透明色为蓝色RGB(0,0,0xff)
实验目的:以bk.bmp为背景,将football.bmp绘制到背景中。
2.1 透明位图绘制原理
假设football.bmp ->载入 HBITMAP hImageBMP -> 选入 HDC hImageDC2.1.1 生成单色掩码位图,透明区域为白色(全1),非透明区域为黑色(全0) HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立单色位图SetBkColor(hImageDC, RGB(0,0,0xff)); // 设置背景色为蓝色BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷贝到hMaskDC这样足球位图中蓝色区域在掩码位图中成了白色,其它区域为黑色。
2.1.2 设置背景色为黑色,前景色为白色,将掩码位图与足球位图相"与" SetBkColor(hImageDC, RGB(0,0,0));SetTextColor(hImageDC, RGB(255,255,255));BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);这样,掩码位图中背景色(黑色)的区域在hImageBMP中被保留,前景色(白色)的部分变为黑色。 2.1.3 设置背景色为白色,前景色为黑色,将掩码位图与背景进行“与”运算SetBkColor(hdcDest,RGB(255,255,255));SetTextColor(hdcDest,RGB(0,0,0));BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);掩码中白色区域(数据与1相“与”结果不变)使背景保持不变,黑色区域变成黑色。
2.1.4 将hImageBMP与背景进行“或”运算 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);这样就将位图绘制到背景上了。2.2 TransparentBlt2函数全部实现代码void TransparentBlt2( HDC hdcDest, // 目标DC int nXOriginDest, // 目标X偏移 int nYOriginDest, // 目标Y偏移 int nWidthDest, // 目标宽度 int nHeightDest, // 目标高度 HDC hdcSrc, // 源DC int nXOriginSrc, // 源X起点 int nYOriginSrc, // 源Y起点 int nWidthSrc, // 源宽度 int nHeightSrc, // 源高度 UINT crTransparent // 透明色,COLORREF类型 ){ HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图 HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图 HDC hImageDC = CreateCompatibleDC(hdcDest); HDC hMaskDC = CreateCompatibleDC(hdcDest); hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP); hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP); // 将源DC中的位图拷贝到临时DC中 if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc) BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY); else StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY); // 设置透明色 SetBkColor(hImageDC, crTransparent); // 生成透明区域为白色,其它区域为黑色的掩码位图 BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 生成透明区域为黑色,其它区域保持不变的位图 SetBkColor(hImageDC, RGB(0,0,0)); SetTextColor(hImageDC, RGB(255,255,255)); BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // 透明部分保持屏幕不变,其它部分变成黑色 SetBkColor(hdcDest,RGB(255,255,255)); SetTextColor(hdcDest,RGB(0,0,0)); BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND); // "或"运算,生成最终效果 BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT); // 清理、恢复 SelectObject(hImageDC, hOldImageBMP); DeleteDC(hImageDC); SelectObject(hMaskDC, hOldMaskBMP); DeleteDC(hMaskDC); DeleteObject(hImageBMP); DeleteObject(hMaskBMP);}