用函数 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 );

解决方案 »

  1.   

    你保存的那个test.png是bmp格式吧。
      

  2.   


    难道这句没有吧图片转换成 png 格式?
    image.Save( _T("d:\\test.png"), Gdiplus::ImageFormatPNG );
      

  3.   

    用BITMAP做中转时,BITMAP不支持透明吧?
      

  4.   


    问题就在这里,如何直接利用获取的 hIcon 转换成 png 图像 ?
    或者通过什么手段可以去掉 png 图像中的黑色背景 ?
      

  5.   

    现在可以把 hicon 保存成 ico 文件了,接下来该如何把这个 ico 文件转换成 png 文件?
      

  6.   

    别用HBITMAP中转,BMP不支持透明的,用GDI+中的IMAGE对象中转。给你点代码看看#include <windows.h>   
    #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