vc++加载透明png图片方法vc++加载透明png图片方法.docx
文本预览下载声明
使用CImage画PNG,原本透明的图片,结果却显示白色/黑色底。解决办法:像素转换。#include atlimagevoid CrossImage(CImage img) //对像素进行转换{if?(Image.GetBPP()?==?32){for(int i=0; iimg.GetWidth(); i++) { for(int j=0; jimg.GetHeight(); j++) { UCHAR *cr = (UCHAR*) img.GetPixelAddress(i,j); cr[0] = cr[0]*cr[3] / 255; cr[1] = cr[1]*cr[3] / 255; cr[2] = cr[2]*cr[3] / 255; } }}}//绘制png CImage img; img.Load(res/smiling.png); CrossImage(img); img.AlphaBlend(dc,15,30);vc++加载透明png图片方法——GDI+和CImage两种在加载png时遇到了麻烦,后来用了两个方法解决了。一个是用GDI+,另外就是用vs.net MFC自带的CImage。先看看GDI+的方法方法1:1.GDI+画透明图层(alpha)的png图片stdafx加入如下:#include?comdef.h//初始化一下com口#include?GdiPlus.husing?namespace?Gdiplus;#pragma?comment(lib,gdiplus.lib)开始初始化:在app类的声明里(.h)加入:ULONG_PTR?m_gdiplusToken;InitInstance()里加入://若没有usingnamespace?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?objectImage?image(_T(1.png));?//?Construct?an?imagegraphics.DrawImage(image,?0,?0,?image.GetWidth(),?image.GetHeight());delete?pDC;这是用GDI+来显示图片。2.CImage绘制带alpha透明图层的png图片用MFC自带的CImage也可以显示,不过要稍微进行转换才能得到正常的带α通道的png图片!在画图前进行一次转换,其中Image是CImage的对象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;}}}具体方法如下:HWND?hwnd?=?GetSafeHwnd();?//获取窗口的HWND::InvalidateRect(?hwnd,?NULL,?true?);?//或者?::InvalidateRect(?hwnd,?NULL,?false?);::UpdateWindow(hwnd);//若使用前不想把原来绘制的图片去掉,可以删去上面那三段CDC?*pDC?=?GetDC();CImage?Image;Image.Load(strPath);if
显示全部