- 1、本文档共16页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
vc加载透明png图片方法.
使用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
文档评论(0)