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