C#的Gdi+还是相当好用的。创建缩略图法式如下:
1. Image生存图像,需要一个CLSID的参数,它可以这样获得:
代码如下:
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;
GetImageEncodersSize(#, &size;);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
2. Image::Save的此外一个参数EncoderParameters可用于图像的压缩*(这是从网上抄下来的)
使用img/jpeg共同encoderParameters.Parameter[0].Value设置 可以大幅度的减小图像文件所占磁盘空间
代码如下:
// 生存到文件
EncoderParameters encoderParameters;
//结构编码参数列表
//数组中只包罗一个EncoderParameter东西
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
//参数类型为LONG
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
//只设置一个参数
encoderParameters.Parameter[0].NumberOfValues = 1;
ULONG quality;
//压缩JPEG图片质量为本来的80%
quality = 80;
encoderParameters.Parameter[0].Value = &quality;
3. 关于缩略图
我使用了一下Image的GetThumbnailImage,发明对付某些图像效果很不抱负,(颜色较鲜艳的缩略图效果好点,但是对付那些色差不大整体又暗的图像效果就低劣了). 这个时候使用Graphic共同Bitmap直接画缩略尺寸的图像效果挺好
代码如下:
BOOL QImgProcess::CreateThumb( int cx ,QBuf &out;)
{
ASSERT(m_pImg != NULL);
// 创建缩略图
int nWidth = m_pImg->GetWidth();
if (cx >= nWidth)
{
return TRUE;
}
int nHeight = m_pImg->GetHeight();
int nThumbHeight = nHeight * cx / m_pImg->GetWidth() ;
Bitmap bitmap(cx, nThumbHeight, PixelFormat24bppRGB);
Graphics graph(&bitmap;);
graph.DrawImage(m_pImg, Rect(0,0,cx,nThumbHeight));
……
}