工作需要又得使用MFC编调试软件。

需要载入一张公司的logo,透明PNG图片。

查了很多资料都没显示,也不想使用其他类。最后用Cimage基本解决。

1.在对话框类的头文件中定义:

[cpp] view plain copy
  1. CImage img;

2.在Onpaint消息响应函数中载入图片并显示图片。

[cpp] view plain copy
  1. if (IsIconic())
  2. {
  3. CPaintDC dc(this); // 用于绘制的设备上下文
  4. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  5. // 使图标在工作区矩形中居中
  6. int cxIcon = GetSystemMetrics(SM_CXICON);
  7. int cyIcon = GetSystemMetrics(SM_CYICON);
  8. CRect rect;
  9. GetClientRect(&rect);
  10. int x = (rect.Width() - cxIcon + 1) / 2;
  11. int y = (rect.Height() - cyIcon + 1) / 2;
  12. // 绘制图标
  13. dc.DrawIcon(x, y, m_hIcon);
  14. }
  15. else
  16. {
  17. CPaintDC dc(this);
  18. if(!img.IsNull()) img.Destroy();
  19. img.Load(_T("12.png"));                           //load载入,否则不显示
  20. TransparentPNG(&img);                               //调用透明化处理函数
  21. if(!img.IsNull()) img.Draw(dc.m_hDC, 80, 20);      //以左上角为原点,按原始大小,在(80,20)处贴图
  22. CDialogEx::OnPaint();
  23. }

3.直接载入将会的到衣服背景色不透明的图片,很傻单也简单实用的办法,将png图像的没像素的RGB值惊进行处理,消除白色背景。

[cpp] view plain copy
  1. void TransparentPNG(CImage *png)
  2. {
  3. for(int i = 0; i <png->GetWidth(); i++)  <span style="white-space:pre;">              </span>//遍历像素处理
  4. {
  5. for(int j = 0; j <png->GetHeight(); j++)
  6. {
  7. unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i , j));
  8. pucColor[0] = pucColor[0] *pucColor[3] / 255;
  9. pucColor[1] = pucColor[1] *pucColor[3] / 255;
  10. pucColor[2] = pucColor[2] *pucColor[3] / 255;
  11. }
  12. }
  13. }

至此就简单的实现了。

方式二:

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)

  1. if (IsIconic())
  2. {
  3. CPaintDC dc(this); // 用于绘制的设备上下文
  4. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  5. // 使图标在工作区矩形中居中
  6. int cxIcon = GetSystemMetrics(SM_CXICON);
  7. int cyIcon = GetSystemMetrics(SM_CYICON);
  8. CRect rect;
  9. GetClientRect(&rect);
  10. int x = (rect.Width() - cxIcon + 1) / 2;
  11. int y = (rect.Height() - cyIcon + 1) / 2;
  12. // 绘制图标
  13. dc.DrawIcon(x, y, m_hIcon);
  14. }
  15. else
  16. {
  17. 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图片相关推荐

  1. c android显示gif动画,MFC显示GIF动画图片

    本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程. 附件  GifPicture.rar (138.1 K ...

  2. 【数字图像处理】一.MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  3. IE6下透明PNG图片的显示

    PNG(Portable Network Graphics)是W3C推荐的网页图片通用格式,但是Microsoft的IE6以下(IE7已经支持)没有把PNG的Alpha 通道打开,造成透明PNG图片的 ...

  4. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  5. python显示透明图片背景

    首先,你得有一种背景色为透明的图片(ps处理过的),比如下面这样的gif图片. 之后可以使用程序在tkinter中配置好你的图像路径,这样就能在图形界面中显示出背景透明的图片了 from tkinte ...

  6. MFC详解显示BMP格式图片

    本文主要是讲述<数字图像处理>系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的<数字图像处理>课程和以前的项目叙述讲解 ...

  7. VS2015+opencv+MFC+显示图片

    网上有很多关于在MFC显示图片的教程,但是看下来感觉对一个小白来说太过于麻烦,总有些东西没有写完成,操作下来总有些错误,实在没有办法我只好下了一个可以运行的例子,比较之后自己按照下载的例子模仿操作总算 ...

  8. html引入png不显示透明北京,解决在网页上显示PNG图片底色不透明的方法

    来源: 网易博客 类别: 编程 作者: 阿拉蕾 发布时间: 2009-9-7 22:09:18 很多时间,我们需要在网页上插入一些没有底色,只有轮廓的图片,而常用的底色透明的图片的有GIF和PNG,如 ...

  9. MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

    最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序 ...

最新文章

  1. 可持久化-可持久化字典树
  2. 我对CSS选择器的认识
  3. mongodb报错一例
  4. 在linux下编译boost库【搜集】
  5. 人脸对齐(二)--ASM算法
  6. linux 让程序在后台执行
  7. 最新Java技术栈面试详细完整
  8. python中除法运算_python除法运算
  9. c++ 中 setw()函数
  10. 《光剑文集》自渡:125首
  11. Pigeon服务的注册与发现
  12. 揭秘:游戏开发的薪资情况和发展前景!
  13. 5G核心网技术基础自学系列 | 消息业务
  14. 呼叫中心坐席功能在职场中的应用
  15. bootloader 启动过程
  16. DataGrid_单击_双击_editable
  17. 【MPS】Jetbrains MPS入门案例Shapes(四)
  18. 求两数最大公约数和最小公倍数(详解)
  19. linux kernal pwn WCTF 2018 klist(一)
  20. 转载:深度学习和缠论应用,JQData应用

热门文章

  1. 民俗多种内涵-农业大健康·万祥军:牛首山谋定世外桃源
  2. 玩转无线路由DD-WRT特色功能
  3. java文件转二进制
  4. 9月20日.周日 第一场正式的比赛:2020年CCPC网络赛
  5. win10系统Onedrive登录输入邮箱后界面空白的解决方法
  6. 计算机家庭网络未识别,Win7排除常见家庭网络问题的方法
  7. android音频系统(7):通话过程中的音频输出设备切换
  8. 拼多多显示服务器有点问题,拼多多为什么登录不上 登录不上解决方法
  9. pppoe服务器账号和密码是什么,路由器的PPPOE拨号宽带账号和密码是多少?
  10. RecyclerView+index索引实现仿微信通讯录