GDI+实现图片格式转换(bmp、jpeg、gif、tiff、png)

通过GDI+我们可以很方便的对bmp、jpeg、gif、tiff、png格式的图片进行转换。

步骤:

1)    通过GdiplusStartup初始化GDI+,以便后续的GDI+函数可以成功调用。

2)    通过GetImageEncodersSize获取GDI+支持的图像格式编码器种类数numEncoders以及ImageCodecInfo数组的存放大小size

3)    通过malloc为ImageCodecInfo数组分配足额空间。

4)    通过GetImageDecoders获取所有的图像编码器信息。

5)    查看ImageCodecInfo.MimeType,查找符合的图像编码器的Clsid。

6)    释放步骤3)分配的内存。

7)    创建Image对象并加载图片。

8)    调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它。

9)    释放Image对象。

10)  通过GdiplusShutdown清理所有GDI+资源。

示例:

[cpp]  view plain copy print ?
  1. #include   
  2. #include   
  3. #include   
  4. using namespace Gdiplus;  
  5.   
  6. #pragma comment(lib,"gdiplus")  
  7.   
  8. int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)  
  9. {  
  10.    UINT  num = 0;          // number of image encoders  
  11.    UINT  size = 0;         // size of the image encoder array in bytes  
  12.   
  13.    ImageCodecInfo* pImageCodecInfo = NULL;  
  14.      
  15.    //2.获取GDI+支持的图像格式编码器种类数以及ImageCodecInfo数组的存放大小  
  16.    GetImageEncodersSize(&num, &size);  
  17.    if(size == 0)  
  18.       return -1;  // Failure  
  19.   
  20.    //3.为ImageCodecInfo数组分配足额空间  
  21.    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));  
  22.    if(pImageCodecInfo == NULL)  
  23.       return -1;  // Failure  
  24.   
  25.    //4.获取所有的图像编码器信息  
  26.    GetImageEncoders(num, size, pImageCodecInfo);  
  27.   
  28.    //5.查找符合的图像编码器的Clsid  
  29.    for(UINT j = 0; j < num; ++j)  
  30.    {  
  31.       if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )  
  32.       {  
  33.          *pClsid = pImageCodecInfo[j].Clsid;  
  34.          free(pImageCodecInfo);  
  35.          return j;  // Success  
  36.       }      
  37.    }  
  38.   
  39.    //6.释放步骤3分配的内存  
  40.    free(pImageCodecInfo);  
  41.    return -1;  // Failure  
  42. }  
  43.   
  44. INT main()  
  45. {  
  46.    GdiplusStartupInput gdiplusStartupInput;  
  47.    ULONG_PTR gdiplusToken;  
  48.      
  49.    //1.初始化GDI+,以便后续的GDI+函数可以成功调用  
  50.    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);  
  51.   
  52.    CLSID   encoderClsid;  
  53.    Status  stat;  
  54.      
  55.    //7.创建Image对象并加载图片  
  56.    Image*   image = new Image(L"f://11.bmp");  
  57.   
  58.    // Get the CLSID of the PNG encoder.  
  59.    GetEncoderClsid(L"image/png", &encoderClsid);  
  60.   
  61.    //8.调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它  
  62.    stat = image->Save(L"11.png", &encoderClsid, NULL);  
  63.   
  64.    if(stat == Ok)  
  65.       printf("Bird.png was saved successfully/n");  
  66.    else  
  67.       printf("Failure: stat = %d/n", stat);   
  68.   
  69.    //9.释放Image对象  
  70.    delete image;  
  71.    //10.清理所有GDI+资源  
  72.    GdiplusShutdown(gdiplusToken);  
  73.    return 0;  
  74. }  

学习资源:

MSDN -> Win32  和 COM开发 -> Graghics and Multimedia  ->  GDI+ -> Using GDI+ ->  Using Image Encoders and Decoders。

你可能感兴趣的:(C++)