用函数 SHGetFileInfo( filePath, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON ); 获取到了文件图标句柄 fileInfo.hIcon,如何把该图标保存成 png 格式的文件 ?我的代码如下,picture 控件中显示的图标是正常的,但是保存成 png 图片后,原来应该透明的地方变成了黑色,该怎么做?
SHFILEINFO fileInfo;
SHGetFileInfo( filePath, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON );
hIcon = fileInfo.hIcon;m_ctrlPicture.GetDC()->DrawIcon( 0, 0, hIcon );HBITMAP hBitmap;
CImage image;BITMAP bmp;
ICONINFO iconInfo;
GetIconInfo( hIcon, &iconInfo );
GetObject( iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bmp );
hBitmap = (HBITMAP)CopyImage( iconInfo.hbmColor, IMAGE_BITMAP, 0, 0, 0 );image.Attach( hBitmap );
image.Save( _T("d:\\test.png"), Gdiplus::ImageFormatPNG );
SHFILEINFO fileInfo;
SHGetFileInfo( filePath, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON );
hIcon = fileInfo.hIcon;m_ctrlPicture.GetDC()->DrawIcon( 0, 0, hIcon );HBITMAP hBitmap;
CImage image;BITMAP bmp;
ICONINFO iconInfo;
GetIconInfo( hIcon, &iconInfo );
GetObject( iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bmp );
hBitmap = (HBITMAP)CopyImage( iconInfo.hbmColor, IMAGE_BITMAP, 0, 0, 0 );image.Attach( hBitmap );
image.Save( _T("d:\\test.png"), Gdiplus::ImageFormatPNG );
难道这句没有吧图片转换成 png 格式?
image.Save( _T("d:\\test.png"), Gdiplus::ImageFormatPNG );
问题就在这里,如何直接利用获取的 hIcon 转换成 png 图像 ?
或者通过什么手段可以去掉 png 图像中的黑色背景 ?
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
#pragma comment(lib,"gdiplus")
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
//2.获取GDI+支持的图像格式编码器种类数以及ImageCodecInfo数组的存放大小
GetImageEncodersSize(&num, &size);
if(size == 0)
return -1; // Failure
//3.为ImageCodecInfo数组分配足额空间
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
//4.获取所有的图像编码器信息
GetImageEncoders(num, size, pImageCodecInfo);
//5.查找符合的图像编码器的Clsid
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
//6.释放步骤3分配的内存
free(pImageCodecInfo);
return -1; // Failure
}
INT main()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
//1.初始化GDI+,以便后续的GDI+函数可以成功调用
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CLSID encoderClsid;
Status stat;
//7.创建Image对象并加载图片
Image* image = new Image(L"f:\\11.bmp");
// Get the CLSID of the PNG encoder.
GetEncoderClsid(L"image/png", &encoderClsid);
//8.调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它
stat = image->Save(L"11.png", &encoderClsid, NULL);
if(stat == Ok)
printf("Bird.png was saved successfully\n");
else
printf("Failure: stat = %d\n", stat);
//9.释放Image对象
delete image;
//10.清理所有GDI+资源
GdiplusShutdown(gdiplusToken);
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yuzl32/archive/2010/03/17/5389919.aspx