ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:70.63KB ,
资源ID:8973289      下载积分:10 金币
验证码下载
登录下载
邮箱/手机:
图形码:
验证码: 获取验证码
温馨提示:
支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/8973289.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请。


权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4009-655-100;投诉/维权电话:18658249818。

注意事项

本文(vc++加载透明png图片方法.docx)为本站上传会员【xrp****65】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

vc++加载透明png图片方法.docx

1、使用CImage画PNG,原本透明的图片,结果却显示白色/黑色底。解决办法:像素转换。 #include void CrossImage(CImage &img) //对像素进行转换 { if (Image.GetBPP() == 32) { for(int i=0; i

2、 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+,另外就是用 MFC自带的CImage。 先看看GDI+的方法 方法1: 1.GDI+画透明图

3、层(alpha)的png图片 stdafx加入如下: #include //初始化一下com口 #include "GdiPlus.h" using namespace Gdiplus; #pragma comment(lib,"gdiplus.lib") 开始初始化: 在app类的声明里(.h)加入: ULONG_PTR m_gdiplusToken; InitInstance()里加入://若没有usingnamespace Gdiplus; 就要在前面加Gdiplus:: GdiplusStartupInput gd

4、iplusStartupInput; GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL); 重载ExitInstance,加入GdiplusShutdown(m_gdiplusToken); int CxxxApp::ExitInstance() { // TODO: 在此添加专用代码和/或调用基类 GdiplusShutdown(m_gdiplusToken); return CWinApp::ExitInstance(); } 显示图片的过程如下 CClientDC *pDC 

5、 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()); dele

6、te 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 

7、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( h

8、wnd, 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

9、) { 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(); R

10、eleaseDC(pDC); 代码中内部的框架是对图像的再次处理,对原来进行了修正,这样得到的更加正常,代码实测如下 绘图后效果 为了方便,封装成一个通用函数: pWnd是需要显示图片的控件窗口,strPicPath是png图片地址,bAutoFit是否需要自动适应pWnd的窗口 [cpp] view plaincopy 1. bool ShowPNGInCtrl(CWnd* pWnd,const CString& strPicPath,BOOL bAutoFit)   2. {   3.     if (NULL == pWnd)   4.     {  

11、 5.         return false;   6.     }   7.     if (NULL == pWnd->GetSafeHwnd())   8.     {   9.         return false;   10.     }   11.     if (strPicPath.GetLength()<=0)   12.     {   13.         return false;   14.     }   15.     try   16.     {   17.         CImage img;   18.        

12、 CRect rect;   19.         int nDPx(0),nDPy(0);//画图的起点   20.         int nDw(0),nDh(0);//画图的宽和高   21.         pWnd->GetClientRect(rect);      22.         HRESULT hr;   23.         hr = img.Load(strPicPath);   24.         if (S_OK != hr)   25.         {   26.             return false;   27.

13、        }   28.         std::unique_ptr pDc;   29.         pDc.reset(new CClientDC(pWnd));   30.    31.         if (bAutoFit)   32.         {   33.             if (img.GetWidth()>img.GetHeight())//说明图片是长方形   34.             {   35.                 nDw  = rect.Width();   36.      

14、           nDh  = (int)(nDw * img.GetHeight() / img.GetWidth());   37.                 nDPx = 0;   38.                 nDPy = (int)(rect.Height()/2.0 - nDh/2.0);   39.                 if (nDh>rect.Height())//说明图片控件是横着放,这时候就要再次缩减   40.                 {   41.                     nDh  =rect.Heigh

15、t();   42.                     nDw  =(int)( img.GetWidth()*nDh/img.GetHeight());   43.                     nDPy = 0;   44.                     nDPx =(int) (rect.Width()/2.0 - nDw/2.0);   45.                 }   46.             }   47.             else//说明竖着比较明显   48.             {   49.     

16、            nDh  = rect.Height();   50.                 nDw  =(int)( img.GetWidth()*nDh/img.GetHeight());   51.                 nDPy = 0;   52.                 nDPx =(int) (rect.Width()/2.0 - nDw/2.0);   53.                 if (nDw>rect.Width())//说明是另外一种情况   54.                 {   55.        

17、             nDw  = rect.Width();   56.                     nDh  = (int)(nDw * img.GetHeight() / img.GetWidth());   57.                     nDPx = 0;   58.                     nDPy = (int)(rect.Height()/2.0 - nDh/2.0);   59.                 }   60.             }   61.         }   62.         

18、else   63.         {   64.             nDw = img.GetWidth();   65.             nDh = img.GetHeight();   66.         }   67.         if (img.GetBPP() == 32) //确认该图像包含Alpha通道   68.         {   69.             int i;   70.             int j;   71.             for (i=0; i

19、 72.             {   73.                 for (j=0; j

20、 / 255;   78.                     pByte[2] = pByte[2] * pByte[3] / 255;   79.                 }   80.             }   81.         }   82.    83.         pDc->SetStretchBltMode(HALFTONE);   84.         img.Draw(pDc->m_hDC,nDPx,nDPy,nDw,nDh);   85.         //img.TransparentBlt(pDc->m_hDC,nDPx,

21、nDPy,nDw,nDh,RGB(255, 255, 255));   86.     }   87.     catch (...)   88.     {   89.         return false;   90.     }   91.     return true;   92. }   -------------------------------------------------------------------------------------------------------------------------------------

22、 3.如果图片是在资源里的时候加载方法又不一样 这时需要两个函数, 对于GDI+如下: BOOL ImageFromIDResource(UINT nID, LPCTSTR sTR,Image *&pImg) { HINSTANCE hInst = AfxGetResourceHandle(); HRSRC hRsrc = ::FindResource (hInst,MAKEINTRESOURCE(nID),sTR); // type if (!hRsrc) return FA

23、LSE; // load resource into memory DWORD len = SizeofResource(hInst, hRsrc); BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc); if (!lpRsrc) return FALSE; // Allocate global memory on which to create stream HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len); BYTE* pmem = (BYTE*)GlobalLock(

24、m_hMem); memcpy(pmem,lpRsrc,len); GlobalUnlock(m_hMem); IStream* pstm; CreateStreamOnHGlobal(m_hMem,FALSE,&pstm); // load from stream pImg=Gdiplus::Image::FromStream(pstm); // free/release stuff pstm->Release(); FreeResource(lpRsrc); GlobalFree(m_hMem); return TRUE; } 这时加

25、载图片的代码变为: 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 *pimage; // Construct an image ImageFromIDResource(IDB_PNG1,_T("PNG"),pimage); graphics.Dra

26、wImage(pimage, 0, 0,pimage->GetWidth(), pimage->GetHeight()); delete pDC; 用CImage时需要如下函数: BOOL LoadImageFromResource(CImage *pImage, UINT nResID,LPCTSTR lpTyp) { if ( pImage == NULL)  return false; pImage->Destroy(); // 查找资源 HRSRC hRsrc = ::FindResource(AfxGetResourceHandle(), M

27、AKEINTRESOURCE(nResID), lpTyp); if (hRsrc == NULL)  return false; // 加载资源 HGLOBAL hImgData = ::LoadResource(AfxGetResourceHandle(), hRsrc); if (hImgData == NULL) { ::FreeResource(hImgData); return false; } // 锁定内存中的指定资源 LPVOID lpVoid = ::LockResource(hImgData); LPSTREAM pS

28、tream = NULL; DWORD dwSize = ::SizeofResource(AfxGetResourceHandle(), hRsrc); HGLOBAL hNew = ::GlobalAlloc(GHND, dwSize); LPBYTE lpByte = (LPBYTE)::GlobalLock(hNew); ::memcpy(lpByte, lpVoid, dwSize); // 解除内存中的指定资源 ::GlobalUnlock(hNew); // 从指定内存创建流对象 HRESULT ht = ::CreateStreamOnHGlob

29、al(hNew, TRUE, &pStream); if ( ht != S_OK ) { GlobalFree(hNew); } else { // 加载图片 pImage->Load(pStream); GlobalFree(hNew); } // 释放资源 ::FreeResource(hImgData); return true; } 这时加载图片的代码如下: HWND hwnd = GetSafeHwnd(); //获取窗口的HWND ::InvalidateRect( hwnd, NULL, true );

30、 //或者 ::InvalidateRect( hwnd, NULL, false ); ::UpdateWindow(hwnd);  CDC *pDC = GetDC(); CImage Image; LoadImageFromResource(&Image,IDB_PNG1,_T("PNG")); if (Image.IsNull()) { MessageBox(_T("没加载成功")); return; } if (Image.GetBPP() == 32) //确认该图像包含Alpha通道 {  int i; int j; for (i=0; i<

31、Image.GetWidth(); i++) { for (j=0; jm_hDC,0,0); Image.Destroy(); ReleaseDC(pDC); 另 要注意的是,最好把绘图放在OnPaint消息响应里,否则,OnSize消息触发OnPaint重绘时可能会把之前的绘图全部清除

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服