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

这几天放假在家无聊编一个程序,在加载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);

 
代码中内部的框架是对图像的再次处理,对原来进行了修正,这样得到的更加正常,代码实测如下
 
图像:
vc++加载透明png图片的两种方法-GDI+和CImage_第1张图片
 
vc++加载透明png图片的两种方法-GDI+和CImage_第2张图片
点击按钮六
用CImage绘制在对话框中
 
vc++加载透明png图片的两种方法-GDI+和CImage_第3张图片
 
用gdi绘制在中间的图片控件
如下
vc++加载透明png图片的两种方法-GDI+和CImage_第4张图片


通过 Wiz 发布

附件:

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

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

你可能感兴趣的:(png,GDI+)