图片格式转换

引言:通过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+资源。 示例: #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/18/5389919.aspx

你可能感兴趣的:(图片格式转换)