`

CImage 对话框初始化时候显示透明 PNG

 
阅读更多

使用CImage的时候,发现显示出来的并不是透明背景的图片,而是白色背景的图片。

后发现原因如下:

PNG图片的透明背景总是一片白色,后来才发现这其实是微软GDI+的设计问题,PNG图片是ARGB,使用GDI+载入图片的时候,GDI+会默认已经进行了预剩运算(PARGB),即每象素的实际值是已经和ALPHA值按比例相乘的结果,实际上它根本就没有做预乘,在使用透明图片的象素ALPHA通道的时候,CImage内部正是调用的AlphaBlend,没有预乘的图当作预乘的图片处理的结果就是这相当于一张和纯白背景进行了预剩,所以图象总是出现白色背景。

解决方法如下:

添加一个转换函数。

如下:

 

CImage img;  
HRESULT result = img.Load(_T("icon.png"));     
for(int i = 0; i < img.GetWidth(); i++)
{
    for(int j = 0; j < img.GetHeight(); j++)
    {
        unsigned char* pucColor = reinterpret_cast<unsigned char *>(img.GetPixelAddress(i , j));
        pucColor[0] = pucColor[0] * pucColor[3] / 255;
        pucColor[1] = pucColor[1] * pucColor[3] / 255;
        pucColor[2] = pucColor[2] * pucColor[3] / 255;
    }
}

 

 

在这里贴上自己项目里面的代码。我的工程要求对话框启动的时候自动加载透明PNG图。开始的时候把加载函数添加到OnInitDialog()里面,但发现没有任何效果,网上查了半天原因,发现画图的函数要添加到OnPaint()里面,修改之后,就生效了。

启动自动加载透明PNG图片的代码(位于OnPaint() 中,待画图的控件是一个ID为IDC_V_H264_LOGO 的 Picture Control):

 

//画对话框不应该添加到OnInitDialog中,否则没有效果
	//应该添加到OnPaint中
	CRect rect;
	GetDlgItem(IDC_V_H264_LOGO)->GetClientRect(&rect);
	if(image.IsNull()==true)
	image.Load(".\\res\\264_ico.png");
	//转换函数?加上后背景为白色的PNG就变成了透明的------------
	//PNG图像自带Alpha通道,存储方式RGBA,代表了透明度,即pucColor[3]
	//当Alpha通道为0时,把RGB值都变成0
	for(int i = 0; i < image.GetWidth(); i++)
	{
		for(int j = 0; j < image.GetHeight(); j++)
		{
			unsigned char* pucColor = reinterpret_cast<unsigned char *>(image.GetPixelAddress(i , j));
			pucColor[0] = pucColor[0] * pucColor[3] / 255;
			pucColor[1] = pucColor[1] * pucColor[3] / 255;
			pucColor[2] = pucColor[2] * pucColor[3] / 255;
		}
	}
	//画一画
	image.Draw(GetDlgItem(IDC_V_H264_LOGO)->GetDC()->m_hDC,rect);


结果如下图所示:

 

 

分享到:
评论

相关推荐

    CImage类基础应用

    1. 创建与初始化:首先,你需要创建一个CImage对象,并可能需要对其进行初始化。这通常在构造函数中完成,例如: ```cpp CImage image; image.Load(_T("path_to_your_image.jpg")); ``` 这里的`Load`函数用于加载...

    VC++利用png图片做底图的漂亮窗口

    例如,你可以创建一个`png_structp`结构体实例来初始化读取过程,然后通过`png_read_image`函数加载图片像素数据。 3. **创建窗口**:创建一个MFC对话框或自定义窗口类,并覆盖OnPaint事件。在这个事件中,我们将...

    InAndOutPictureDlgTest.rar

    在"InAndOutPictureDlgTest"中,关键在于初始化对话框时的代码逻辑。首先,开发者会在 OnInitDialog() 函数中加载图片,并设置其初始透明度。然后,通过定时器(CTimer)来定期更新图像的透明度,从而实现渐变效果。...

    mfc图片导入方法集

    然后在对话框初始化代码中,加载图片并设置控件的位图: ```cpp CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); // IDB_BITMAP1是你的资源ID CStatic* pStaticCtrl = (CStatic*)GetDlgItem(IDC_IMAGE_STATIC); ...

    show-picture-in-Picture-controller.rar_PICTURE CONTROL_picture_s

    7. **对话框或视图集成**: 如果是在MFC的对话框或者视图中使用Picture Control,可能还需要将控件添加到布局中,并在对话框或视图的初始化函数中加载图片。 从压缩包中的文件名称"show picture in Picture ...

    C++加载图片

    - **初始化**:在你的MFC项目中,首先需要包含头文件`#include &lt;afxext.h&gt;`,这将引入CImage类。 - **创建窗口**:创建一个MFC对话框或视图,其中包含一个CStatic控件用于显示图片。 - **加载图片**:在合适的...

    大恒相机采集照片mfc

    1. **初始化相机**:在MFC应用程序启动时,需要调用大恒相机的初始化函数,建立与相机的连接,获取相机的配置信息。 2. **设置相机参数**:通过API函数可以设置相机的曝光时间、增益、分辨率等参数,以满足不同的...

    mfc+opencv读取摄像头视频并实现抓图

    通常,USB摄像头的设备ID为0,所以初始化`VideoCapture`时传入0即可: ```cpp cv::VideoCapture cap(0); if (!cap.isOpened()) { // 处理错误,摄像头未打开 } ``` 4. 显示视频流: 为了在MFC对话框中显示视频,...

    基于MFC的图片浏览器的设计与实现

    1. **CWinApp 类**:这是应用程序的主入口点,继承自CWinApp的类负责初始化应用程序、处理命令消息和管理文件关联等。 2. **CFrameWnd 或 CMDIFrameWnd 类**:这是应用程序的主窗口,可以作为图片浏览器的外壳,...

    MFC,VC++实现调用摄像头,并保存为图片等相关操作!

    4. 调用`Create`方法初始化`CVideoWindow`,设置其父窗口为对话框。 5. 设置视频流的显示属性,如分辨率和帧率。 ### 4. 图片保存 捕获并保存摄像头的图像通常需要创建一个位图对象,然后从视频流中复制一帧数据...

    读显图像文件程序.pdf

    在视图类中,我们需要额外的成员变量`m_iWidth`和`m_iHeight`来存储图像的宽度和高度,以及一个布尔变量`m_bInit`,标记窗口是否已经初始化。在`OnDraw`函数中,如果`img`不为空,就调用`BitBlt`方法将图像绘制到...

    MFC图片处理类CPicture

    1. 构造函数和析构函数:用于初始化和清理类资源,可能包括加载图片文件。 2. 加载和保存方法:如`Load`和`Save`,分别用于从文件加载图片和将图片保存到文件,可能支持多种图像格式。 3. 显示方法:如`Draw`,用于...

    MFC抠图软件源码 MFC抠图软件源码 MFC抠图软件源码 MFC抠图软件源码

    2. **主窗口类**:查找应用程序的主窗口类,了解如何初始化和显示窗口。 3. **图像处理函数**:找到处理图像的关键函数,如加载、保存、抠图算法实现。 4. **用户交互逻辑**:分析按钮、菜单等控件的事件处理函数,...

    MFC 仿QQ简单截图功能

    1. **初始化**:首先,确保你的MFC应用程序已经包含了必要的头文件,如 `&lt;afxwin.h&gt;` 和 `&lt;afxdisp.h&gt;`,以使用上述类。 2. **捕获屏幕**:通过 CDC 类的 `CreateCompatibleDC` 创建一个兼容的设备上下文,然后调用...

    视频读取源代码

    1. **初始化VFW**: 使用`capCreateCaptureWindow`函数创建一个捕获窗口,这个窗口将显示从摄像头捕获的视频流。 2. **连接到摄像头**: 通过`capSetVideoFormat`函数设置视频格式,然后使用`capDlgVideoSource`打开...

    123.zip_GDI/图象编程_Visual_C++_

    在OnInitDialog()函数中初始化树形控件,设置其样式,如TVS_HASLINES、TVS_HASBUTTONS等,以便显示线条和折叠按钮。 2. **GDI绘图基础** GDI提供了许多基本绘图对象,如画刷(CBrush)、画笔(CPen)、字体(CFont...

Global site tag (gtag.js) - Google Analytics