您的位置:首页 > 编程语言 > C语言/C++

[vc] vc++加载透明png图片的两种方法-GDI+和CImage

2014-04-18 10:52 429 查看
http://czy.t.blog.163.com/blog/static/11691154820120260917596/

这几天放假在家无聊编一个程序,在加载png时遇到了麻烦,后来用了两个方法解决了。一个是用GDI+,另外就是用vs.net MFC自带的CImage。

方法1:

GDI+

stdafx加入如下:

#include <comdef.h>//初始化一下com口

#include "GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib,"gdiplus.lib")

开始初始化:

在app类的声明里(.h)加入:

ULONG_PTR m_gdiplusToken;

InitInstance()里加入://若没有using namespace Gdiplus; 就要在前面加Gdiplus::

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

重载ExitInstance,加入GdiplusShutdown(m_gdiplusToken);

int CxxxApp::ExitInstance()

{
// TODO: 在此添加专用代码和/或调用基类
GdiplusShutdown(m_gdiplusToken);

return CWinApp::ExitInstance();
}

显示图片的过程如下

CClientDC *pDC = new CClientDC(GetDlgItem(IDC_STATIC_PIC));
CRect rect;
GetDlgItem(IDC_STATIC_PIC)->GetWindowRect(&rect);
Graphics graphics(pDC->m_hDC); // Create a GDI+ graphics object
Image image(_T("1.png")); // Construct an image
graphics.DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());
delete pDC;

方法2:

用CImage类

这是用GDI+来显示图片,用MFC自带的CImage也可以显示,不过要稍微进行转换才能得到正常的带α通道的png图片!

方法如下

HWND hwnd = GetSafeHwnd(); //获取窗口的HWND

::InvalidateRect( hwnd, NULL, true ); //或者 ::InvalidateRect( hwnd, NULL, false );
::UpdateWindow(hwnd);
//若使用前不想把原来绘制的图片去掉,可以删去上面那三段

CDC *pDC = GetDC();

CImage Image;

Image.Load(strPath);

if (Image.IsNull())

{

MessageBox(_T("没加载成功"));

return -1;

}

if (Image.GetBPP() == 32) //确认该图像包含Alpha通道

{

int i;

int j;

for (i=0; i<Image.GetWidth(); i++)

{

for (j=0; j<Image.GetHeight(); j++)

{

byte *pByte = (byte *)Image.GetPixelAddress(i, j);

pByte[0] = pByte[0] * pByte[3] / 255;

pByte[1] = pByte[1] * pByte[3] / 255;

pByte[2] = pByte[2] * pByte[3] / 255;

}

}

}

Image.Draw(pDC->m_hDC,0,0);

Image.Destroy();

ReleaseDC(pDC);

代码中内部的框架是对图像的再次处理,对原来进行了修正,这样得到的更加正常,代码实测如下

图像:





点击按钮六

用CImage绘制在对话框中



用gdi绘制在中间的图片控件

如下



通过 Wiz 发布

附件:

工程文件下载地址1(VS2010编译)
工程文件下载地址2(
vs2010 编译)

可以写在WM_ERASEBKGND消息中,来改变MFC对话框的背景样式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: