先看代码:
usingSystem;
usingSystem.Drawing;
usingSystem.Drawing.Imaging;
usingSystem.Drawing.Drawing2D;
/**////<summary>
///
///**生成高质量缩略图程序**
///
///File:GenerateThumbnail.cs
///
///Author:周振兴(Zxjay飘遥)
///
///E-Mail:tda7264@163.com
///
///Date:07-04-07
///
///</summary>
publicclassGenerateThumbnail
...{
/**////<summary>
///生成缩略图静态方法
///</summary>
///<paramname="pathImageFrom">源图的路径(含文件名及扩展名)</param>
///<paramname="pathImageTo">生成的缩略图所保存的路径(含文件名及扩展名)
///注意:扩展名一定要与生成的缩略图格式相对应</param>
///<paramname="width">欲生成的缩略图"画布"的宽度(像素值)</param>
///<paramname="height">欲生成的缩略图"画布"的高度(像素值)</param>
publicstaticvoidGenThumbnail(stringpathImageFrom,stringpathImageTo,intwidth,intheight)
...{
ImageimageFrom=null;
try
...{
imageFrom=Image.FromFile(pathImageFrom);
}
catch
...{
//throw;
}
if(imageFrom==null)
...{
return;
}
//源图宽度及高度
intimageFromWidth=imageFrom.Width;
intimageFromHeight=imageFrom.Height;
//生成的缩略图实际宽度及高度
intbitmapWidth=width;
intbitmapHeight=height;
//生成的缩略图在上述"画布"上的位置
intX=0;
intY=0;
//根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置
if(bitmapHeight*imageFromWidth>bitmapWidth*imageFromHeight)
...{
bitmapHeight=imageFromHeight*width/imageFromWidth;
Y=(height-bitmapHeight)/2;
}
else
...{
bitmapWidth=imageFromWidth*height/imageFromHeight;
X=(width-bitmapWidth)/2;
}
//创建画布
Bitmapbmp=newBitmap(width,height);
Graphicsg=Graphics.FromImage(bmp);
//用白色清空
g.Clear(Color.White);
//指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。
g.InterpolationMode=InterpolationMode.HighQualityBicubic;
//指定高质量、低速度呈现。
g.SmoothingMode=SmoothingMode.HighQuality;
//在指定位置并且按指定大小绘制指定的Image的指定部分。
g.DrawImage(imageFrom,newRectangle(X,Y,bitmapWidth,bitmapHeight),newRectangle(0,0,imageFromWidth,imageFromHeight),GraphicsUnit.Pixel);
try
...{
//经测试.jpg格式缩略图大小与质量等最优
bmp.Save(pathImageTo,ImageFormat.Jpeg);
}
catch
...{
}
finally
...{
//显示释放资源
imageFrom.Dispose();
bmp.Dispose();
g.Dispose();
}
}
}
生成的缩略图大小一定,无剪裁、无变形。
可以测试一下各种图形格式、图形质量、呈现方式生成的缩略图的大小和视觉质量。
经测试:Vista原默认桌面.jpg格式尺寸:1024*768,
生成原尺寸大小的缩略图,比较如下:
原图.jpg格式,223KB
.jpg102KB
.png1816KB
.gif228KB
.tiff2000KB以上
…
视觉上除.gif质量较差外,其他的与源图肉眼无法区别(本人有点近视^-^)
在考虑到专利及通用性等因素,推荐用.jpg格式。
【C# 生成高质量缩略图程序—终极算法】相关文章: