C++ 设置透明背景图片
背景:
有两个图片,一个是目标背景图片, 一个是带有自身背景色彩的彩色图片
先将这彩色图片绘制到目标背景图片中, 这一步通过BITBLT就可实现。 但实现后的效果是: 目标图片上,绘制上去的彩色图片带有其本身的背景。
问题就来了, 我们想将彩色图片本身的背景去掉,应该如何解决?
解决方法:
使用API函数:TransparentBlt 此函数将原DC中的图片绘制到目标DC中,并同时设置原图形在目标图形上的透明色。
BOOL TransparentBlt(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of destination upper-left corner
int nYOriginDest, // y-coord of destination upper-left corner
int nWidthDest, // width of destination rectangle
int hHeightDest, // height of destination rectangle
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of source upper-left corner
int nYOriginSrc, // y-coord of source upper-left corner
int nWidthSrc, // width of source rectangle
int nHeightSrc, // height of source rectangle
UINT crTransparent // color to make transparent
);
如本例中,将透明色设置为彩色图形自带背景色时, 则使用此函数后,所得最终图形上彩色图形的自身背景色就消除了。
CDC* pDC=GetDC(); CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); BITMAP bmpInfo;
bmp.GetObject(sizeof(BITMAP),&bmpInfo); CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC); CBitmap *pOldImageBmp=ImageDC.SelectObject(&bmp); CBitmap bmpBK;
bmpBK.LoadBitmap(IDB_BITMAP2); BITMAP bmpBkInfo;
bmpBK.GetObject(sizeof(BITMAP),&bmpBkInfo); CDC bkDC;
bkDC.CreateCompatibleDC(pDC); bkDC.SelectObject(&bmpBK); TransparentBlt(bkDC.m_hDC,,,bmpInfo.bmWidth,bmpInfo.bmHeight,ImageDC.m_hDC,,,bmpInfo.bmWidth,bmpInfo.bmHeight,RGB(,,)); // 设置红色为透明色 BitBlt(pDC->m_hDC,,,bmpBkInfo.bmWidth,bmpBkInfo.bmHeight,bkDC.m_hDC,,,SRCCOPY); //画到屏幕上
原理: 通过设置掩码位图来实现
1)首先建立掩码位图
2)使用掩码位图作用于彩色原图,得到变异新图(透明色为黑,其他区域为原色)
3)使用掩码位图与目标背景图相与 (透明区域为透明色,其他区域为黑色)
4)使用变异新图与目标背景图相或 ,得到最终图
C++ 设置透明背景图片的更多相关文章
- Visual Studio 2017 设置透明背景图
一.前言 给大家分享一下,如何为VS2017设置透明背景图.下面是一张设置前和设置后的图片. 设置前: 设置后: 二.设置背景图片的扩展程序 我们打开VS的扩展安装界面:[工具]->[扩展和更新 ...
- 网页中PNG透明背景图片的完美应用
PNG 图片在网站设计中是不可或缺的部分,最大的特点应该在于 PNG 可以无损压缩,而且还可以设置透明,对于增强网站的图片色彩效果有重要的作用. 但为什么 PNG 图片却没有 GIF 和 JPG 图片 ...
- Qt 制作透明背景图片与裁剪图片(很实用)
这两天想做一个五子棋游戏,想从零开始自己绘制各种图片素材,将经验心得整理如下. 制作透明背景图片: void MyPainter::DrawKit() { QImage image(30, 30, Q ...
- 设置VS2017背景图片
设置方法很简单:安装扩展ClaudiaIDE 1.在这里下载扩展,https://visualstudiogallery.msdn.microsoft.com/9ba50f8d-f30c-4e33-a ...
- 设置JFrame背景图片
这里我就放上改写的代码吧,不做多的解释,推荐一个好的博文 https://blog.csdn.net/jdsjlzx/article/details/16831815 public void ini_ ...
- vc下打印透明背景图片
一.前言 刚接到个任务,要把带有透明背景的章子图片打印出来,开始觉得不是很简单吗,直接用vc自动生成的打印功能不就ok了.不过问题却不是想像的那么简单! 二.窗口中显示透明图片 在窗口中显示图片,可以 ...
- 设置按钮背景图片(HTML-CSS)
很多人提交表单时都喜欢用一个图片来作为提交按钮,大多数人可能用JS去操作表单的提交,即当用户点击这个图片时响应一个JS来提交表单.其实还有一种方法,就是直接设置SUBMIT按钮的图片背景.设置它的图片 ...
- MFC 设置窗口背景图片
//在Onpaint函数中加入如下代码 //----------给窗口设置背景图片---------------------------- CPaintDC dc(this); CRect myrec ...
- IOS 在IOS6中设置navigationBar背景图片 会有一条 黑色阴影 --- 解决方案
//给navigationBar设置背景图片 if ([self.navigationController.navigationBar respondsToSelector:@selector(set ...
随机推荐
- Java - 30 Java 网络编程
Java 网络编程 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中J2SE的API包含有类和接口,它们提供低层次的通信细节.你可以直接使用这些类和接 ...
- CS229 6.16 Neurons Networks linear decoders and its implements
Sparse AutoEncoder是一个三层结构的网络,分别为输入输出与隐层,前边自编码器的描述可知,神经网络中的神经元都采用相同的激励函数,Linear Decoders 修改了自编码器的定义,对 ...
- oi造数据
#include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #includ ...
- [Lua]table(一):打印与复制
一.打印table function PrintTable(tb) if type(tb) ~= "table" then print(tb) return end local c ...
- 转:Java对象序列化
Java对象序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收 ...
- python ftp文件夹文件递归上传推送
- jquery小效果:新浪游戏右侧导航菜单 (页面效果)
偷盗:新浪游戏右侧导航菜单 http://games.sina.com.cn 效果: 随着页面的滚动,左侧页面的内容,和右侧的导航菜单的按钮文字对应: 点击右侧的导航按钮,左侧页面滚动到相应的内容 2 ...
- MySQL PID错误,Mysql server PID file could not be found!
https://blog.csdn.net/u010098331/article/details/50752667/
- 13. 字符串转为json对象或json数组
##########1.json字符串转json数组########### var str="[{name:'zhangsan',age:'24'},{name:'lisi',age:'30 ...
- win8换win7的操作方法
详细参考UEFI与 Legacy BIOS两种启动模式详解 BIOS的两种引导模式 win8更换win7的方法的两个步骤: (1).设置BIOS支持Legacy启动,具体目标就是设置secur ...