使用GDI+轻松创建缩略图

Gdi+ 还是相当好用的.  

 

1> Image保存图像,需要一个CLSID的参数,它可以这样获得:

  1. int   GetEncoderClsid(const   WCHAR*   format,   CLSID*   pClsid)   
  2. {   
  3.     UINT     num   =   0;                     //   number   of   image   encoders   
  4.     UINT     size   =   0;                   //   size   of   the   image   encoder   array   in   bytes   
  5.     ImageCodecInfo*   pImageCodecInfo   =   NULL;   
  6.     GetImageEncodersSize(&num,   &size);   
  7.     if(size   ==   0)   
  8.         return   -1;     //   Failure   
  9.     pImageCodecInfo   =   (ImageCodecInfo*)(malloc(size));   
  10.     if(pImageCodecInfo   ==   NULL)   
  11.         return   -1;     //   Failure   
  12.     GetImageEncoders(num,   size,   pImageCodecInfo);   
  13.     for(UINT   j   =   0;   j   <   num;   ++j)   
  14.     {   
  15.         if(   wcscmp(pImageCodecInfo[j].MimeType,   format)   ==   0   )   
  16.         {   
  17.             *pClsid   =   pImageCodecInfo[j].Clsid;   
  18.             free(pImageCodecInfo);   
  19.             return   j;     //   Success   
  20.         }           
  21.     }   
  22.     free(pImageCodecInfo);   
  23.     return   -1;     //   Failure   
  24. }   

 

 

2> Image::Save的另外一个参数EncoderParameters可用于图像的压缩*(这是从网上抄下来的)

使用img/jpeg配合encoderParameters.Parameter[0].Value设置 可以大幅度的减小图像文件所占磁盘空间

  1. // 保存到文件  
  2.     EncoderParameters encoderParameters;    
  3.     //构造编码参数列表    
  4.     //数组中只包含一个EncoderParameter对象    
  5.     encoderParameters.Count = 1;    
  6.     encoderParameters.Parameter[0].Guid = EncoderQuality;    
  7.     //参数类型为LONG    
  8.     encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;    
  9.     //只设置一个参数    
  10.     encoderParameters.Parameter[0].NumberOfValues = 1;    
  11.     ULONG quality;    
  12.     //压缩JPEG图片质量为原来的80%    
  13.     quality = 80;    
  14.     encoderParameters.Parameter[0].Value = &quality;    

 

3> 关于缩略图

我使用了一下Image的GetThumbnailImage,发现对于某些图像效果很不理想,(颜色较鲜艳的缩略图效果好点,但是对于那些色差不大整体又暗的图像效果就差劲了). 这个时候使用Graphic配合Bitmap直接画缩略尺寸的图像效果挺好

  1. BOOL QImgProcess::CreateThumb( int cx ,QBuf &out)  
  2. {  
  3.     ASSERT(m_pImg != NULL);  
  4.     // 创建缩略图  
  5.     int nWidth = m_pImg->GetWidth();  
  6.     if (cx >= nWidth)  
  7.     {  
  8.         return TRUE;  
  9.     }  
  10.     int nHeight = m_pImg->GetHeight();  
  11.     int nThumbHeight = nHeight * cx / m_pImg->GetWidth() ;  
  12.     Bitmap bitmap(cx, nThumbHeight, PixelFormat24bppRGB);    
  13.     Graphics graph(&bitmap);   
  14.     graph.DrawImage(m_pImg, Rect(0,0,cx,nThumbHeight));  
  15. ......  
  16. }  

 

posted @ 2014-10-10 15:25  r163  阅读(795)  评论(0编辑  收藏  举报