MFC 显示透明png图片
工作需要又得使用MFC编调试软件。
需要载入一张公司的logo,透明PNG图片。
查了很多资料都没显示,也不想使用其他类。最后用Cimage基本解决。
1.在对话框类的头文件中定义:
- CImage img;
2.在Onpaint消息响应函数中载入图片并显示图片。
- if (IsIconic())
- {
- CPaintDC dc(this); // 用于绘制的设备上下文
- SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
- // 使图标在工作区矩形中居中
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // 绘制图标
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CPaintDC dc(this);
- if(!img.IsNull()) img.Destroy();
- img.Load(_T("12.png")); //load载入,否则不显示
- TransparentPNG(&img); //调用透明化处理函数
- if(!img.IsNull()) img.Draw(dc.m_hDC, 80, 20); //以左上角为原点,按原始大小,在(80,20)处贴图
- CDialogEx::OnPaint();
- }
3.直接载入将会的到衣服背景色不透明的图片,很傻单也简单实用的办法,将png图像的没像素的RGB值惊进行处理,消除白色背景。
- void TransparentPNG(CImage *png)
- {
- for(int i = 0; i <png->GetWidth(); i++) <span style="white-space:pre;"> </span>//遍历像素处理
- {
- for(int j = 0; j <png->GetHeight(); j++)
- {
- unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));
- pucColor[0] = pucColor[0] *pucColor[3] / 255;
- pucColor[1] = pucColor[1] *pucColor[3] / 255;
- pucColor[2] = pucColor[2] *pucColor[3] / 255;
- }
- }
- }
至此就简单的实现了。
方式二:
AlphaBlend是Window自带的GDI函数,在作GUI的时候为了达到更漂亮的效果我们常常用它.
BLENDFUNCTION是AlphaBlend用控制透明效果的重要参数.
定义如下:
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
BlendOp: 这个参数必须也只能为AC_SRC_OVER(0x00),意思就是把源图片覆盖到目标之上.
BlendFlags: 必须为0
SourceConstantAlpha: 简写为SCA,指定源图片的透明度,这个值是会和源图片的Alpha通道值合并计算的.
AlphaFormat: 可以填两种,一种是0x00,一种是AC_SRC_ALPHA(0x01).填0的话,AlphaBlend据说就和BitBlt一样了,我没有试验过~填1的话,源DC必须是32位的DC不然的话,AlphaBlend会返回参数错误.
计算公式(当SCA不是0xFF时):
输出像素(R,G,B,A) = 源像素(R,G,B,A) * SCA / 0xFF + 目标像素(R,G,B,A) * (1.0 - SCA / 0xFF)
当SCA是0xFF时,计算公式
输出像素(R,G,B,A) = 源像素(R,G,B,A) + 目标像素(R,G,B,A) * (1.0 - 源像素(A) / 0xFF)
混合计算公式
输出像素(R,G,B) = 源像素(R,G,B) * SCA / 0xFF + 目标像素(R,G,B) * (1.0 - 源像素(A) / 0xFF * SCA / 0xFF)
- if (IsIconic())
- {
- CPaintDC dc(this); // 用于绘制的设备上下文
- SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
- // 使图标在工作区矩形中居中
- int cxIcon = GetSystemMetrics(SM_CXICON);
- int cyIcon = GetSystemMetrics(SM_CYICON);
- CRect rect;
- GetClientRect(&rect);
- int x = (rect.Width() - cxIcon + 1) / 2;
- int y = (rect.Height() - cyIcon + 1) / 2;
- // 绘制图标
- dc.DrawIcon(x, y, m_hIcon);
- }
- else
- {
- CPaintDC dc(this);
if (!img.IsNull()) img.Destroy();
img.Load(_T("logo.png")); //load载入,否则不显示
HDC hMemDC;
HBITMAP bmpMem;
bmpMem = CreateCompatibleBitmap(dc.m_hDC, 413, 69);
hMemDC = CreateCompatibleDC(dc.m_hDC);
HGDIOBJ hOldObj = ::SelectObject(hMemDC, bmpMem);
BLENDFUNCTION bindfun;
//设置AlphaBind的最后一个参数
bindfun.BlendOp = AC_SRC_OVER;
bindfun.BlendFlags = 0;
bindfun.SourceConstantAlpha = 255;
bindfun.AlphaFormat = AC_SRC_ALPHA; // AC_SRC_ALPHA
//img.AlphaBlend(hMemDC, 0, 0, 413, 69, 0, 0, 413, 69, bindfun);
AlphaBlend(hMemDC, 0, 0, 413, 69, img.GetDC(), 0, 0, 413, 69, bindfun);
::TransparentBlt(dc.m_hDC, 80, 20, 413, 69, hMemDC, 0, 0, 412, 68, RGB(0, 0, 0)); CDialogEx::OnPaint(); }
MFC 显示透明png图片相关推荐
- c android显示gif动画,MFC显示GIF动画图片
本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件 GifPicture.rar (138.1 K ...
- 【数字图像处理】一.MFC详解显示BMP格式图片
本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...
- IE6下透明PNG图片的显示
PNG(Portable Network Graphics)是W3C推荐的网页图片通用格式,但是Microsoft的IE6以下(IE7已经支持)没有把PNG的Alpha 通道打开,造成透明PNG图片的 ...
- MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)
惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...
- python显示透明图片背景
首先,你得有一种背景色为透明的图片(ps处理过的),比如下面这样的gif图片. 之后可以使用程序在tkinter中配置好你的图像路径,这样就能在图形界面中显示出背景透明的图片了 from tkinte ...
- MFC详解显示BMP格式图片
本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...
- VS2015+opencv+MFC+显示图片
网上有很多关于在MFC显示图片的教程,但是看下来感觉对一个小白来说太过于麻烦,总有些东西没有写完成,操作下来总有些错误,实在没有办法我只好下了一个可以运行的例子,比较之后自己按照下载的例子模仿操作总算 ...
- html引入png不显示透明北京,解决在网页上显示PNG图片底色不透明的方法
来源: 网易博客 类别: 编程 作者: 阿拉蕾 发布时间: 2009-9-7 22:09:18 很多时间,我们需要在网页上插入一些没有底色,只有轮廓的图片,而常用的底色透明的图片的有GIF和PNG,如 ...
- MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片
最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...
最新文章
- 可持久化-可持久化字典树
- 我对CSS选择器的认识
- mongodb报错一例
- 在linux下编译boost库【搜集】
- 人脸对齐(二)--ASM算法
- linux 让程序在后台执行
- 最新Java技术栈面试详细完整
- python中除法运算_python除法运算
- c++ 中 setw()函数
- 《光剑文集》自渡:125首
- Pigeon服务的注册与发现
- 揭秘:游戏开发的薪资情况和发展前景!
- 5G核心网技术基础自学系列 | 消息业务
- 呼叫中心坐席功能在职场中的应用
- bootloader 启动过程
- DataGrid_单击_双击_editable
- 【MPS】Jetbrains MPS入门案例Shapes(四)
- 求两数最大公约数和最小公倍数(详解)
- linux kernal pwn WCTF 2018 klist(一)
- 转载:深度学习和缠论应用,JQData应用
热门文章
- 民俗多种内涵-农业大健康·万祥军:牛首山谋定世外桃源
- 玩转无线路由DD-WRT特色功能
- java文件转二进制
- 9月20日.周日 第一场正式的比赛:2020年CCPC网络赛
- win10系统Onedrive登录输入邮箱后界面空白的解决方法
- 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
- android音频系统(7):通话过程中的音频输出设备切换
- 拼多多显示服务器有点问题,拼多多为什么登录不上 登录不上解决方法
- pppoe服务器账号和密码是什么,路由器的PPPOE拨号宽带账号和密码是多少?
- RecyclerView+index索引实现仿微信通讯录