miracle

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  0 Posts :: 1 Stories :: 2 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

我之前用Bitmap::FromHICON来保存图标句柄到Png的时候,发现有alpha通道的图标的透明值会变成黑色,后来偶尔看到了一个.net的解决代码,我把它变成了c++,代码如下仅供参考。工具(vs2008,依赖类库GDI+)

 1bool CGdiPlusHelper::SaveHIcon2PngFile(HICON hIcon, LPCTSTR lpszPicFileName)
 2{  
 3 if (hIcon == NULL)
 4 {
 5  ASSERT(FALSE);
 6  return false;
 7 }

 8
 9 ICONINFO icInfo = 0 };
10 if (!::GetIconInfo(hIcon, &icInfo))
11 {
12  ASSERT(FALSE);
13  return false;
14 }

15 BITMAP bitmap; 
16 GetObject(icInfo.hbmColor, sizeof(BITMAP), &bitmap);
17 
18 Bitmap* pBitmap = NULL;
19 Bitmap* pWrapBitmap = NULL;
20 if (bitmap.bmBitsPixel != 32
21 {   
22  pBitmap = Bitmap::FromHICON(hIcon); 
23 }
 
24  else
25  {
26   pWrapBitmap = Bitmap::FromHBITMAP(icInfo.hbmColor, NULL);
27   BitmapData bitmapData;
28   Rect rcImage(0,0, pWrapBitmap->GetWidth(), pWrapBitmap->GetHeight());
29   pWrapBitmap->LockBits(&rcImage, ImageLockModeRead, pWrapBitmap->GetPixelFormat(), &bitmapData); 
30 
31   pBitmap = new Bitmap(bitmapData.Width, bitmapData.Height, bitmapData.Stride, 
32       PixelFormat32bppARGB, (BYTE*)bitmapData.Scan0);
33  }

34
35 bool bRet = CGdiPlusHelper::SavePng(pBitmap, lpszPicFileName);
36 delete pBitmap; 
37 if (pWrapBitmap)
38  delete pWrapBitmap;
39 DeleteObject(icInfo.hbmColor); 
40 DeleteObject(icInfo.hbmMask); 
41 return bRet;
42}

43
posted on 2009-12-21 22:11 miracle_chen 阅读(4378) 评论(2)  编辑 收藏 引用 所属分类: GDI/GDI+

Feedback

# re: 解决关于GDI+ Bitmap::FromHICON 图片变黑边的问题 2010-09-19 17:57 你条草
楼主英明,但这个方法并不是所有图标都能够解决,部分Hlep(帮助说明文档、vc++6.0)等旧式图标会无法显示出来,估计是透明通道上全被0x00所填充吧,因为我是将提取到的文件图标画到32位格式的背景上,带透明度值
所以后来采用CDC上的DrawIcon,效果同楼主一样,但是我说的旧式图标就能够显示,但显示出来是半透明的,如果底色是纯白色就看不到图标,如果背景不是纯白色就能够看到图标……
希望知道楼主有没有较好的解决方案!  回复  更多评论
  

# re: 解决关于GDI+ Bitmap::FromHICON 图片变黑边的问题 2012-02-29 13:36 99708294@qq.com
我也碰到同上问题。。 解决方法,经过转换后的BITMAT 分析每个像素点的A值,如果都未0表示透明了 这个时候,直接转换为BITMAP 希望对碰见同类问题的朋友有所帮助。
Gdiplus::Color Bmpcolor;
BOOL BmpcolorTag=TRUE;;
for (int bmpx=0;bmpx<pBitmap->GetWidth();bmpx++)
{
for (int bmpy=0;bmpy<pBitmap->GetHeight();bmpy++)
{
pBitmap->GetPixel(bmpx,bmpy,&Bmpcolor);
if((Bmpcolor.GetValue()>>24)!=0)
{
BmpcolorTag=FALSE;
break;
}
}
if (BmpcolorTag==FALSE)
break;
}
if (BmpcolorTag==TRUE)
{
SAFE_DELETE(pWrapBitmap);
DeleteObject(icInfo.hbmColor);
DeleteObject(icInfo.hbmMask);
pBitmap = Gdiplus::Bitmap::FromHICON(hIcon);
}  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航:   博客园   博客园最新博文   博问   管理