C#使用GDI+创建缩略图实例
程序员文章站
2023-12-16 16:46:46
本文实例讲述了c#使用gdi+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:
c#的gdi+还是相当好用的。创建缩略图步骤如下:
1. image保存图像,...
本文实例讲述了c#使用gdi+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:
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(&num, &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
}
{
uint num = 0; // number of image encoders
uint size = 0; // size of the image encoder array in bytes
imagecodecinfo* pimagecodecinfo = null;
getimageencoderssize(&num, &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;
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));
......
}
{
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));
......
}
希望本文所述对大家的c#程序设计有所帮助。