分享一个简单而实用的缩略图方法
不知道大家网站上的缩略图是怎么"缩"的呢?
马上又要开始一个新的项目,过来这个公司养成了一个新的习惯,就是会把遇到的一些实用的程序保存下来.
我想这是一个好习惯..以前只是觉得存起来有用.现在是实际做到这一步了:"把有用的程序都保存下来"
这就是想与做的不同.
现在缩略图基本上有几种方式:
1.填充的方式
2.按高缩略
3.按宽缩略
4.切除方式
我简单地举例描述下这几种方式及它们的缺点(因为优点没啥好讲的):
1.就是把图片A按一定的宽跟高缩略,例如图片A的宽跟高是400*500,把它缩略成200*250,这样图片就是缩小了1/2,但有一个问题,假设我要把一个400*500的图片缩略成200*200的图,这样缩略下去.这个图就变形了.
2.按高跟宽缩略是指按指定的缩略高或宽缩略,例如图片A的宽跟高是400*500,我按宽缩略为200,那宽就是500*200/400=250了,如果我按高缩略为200,那高就是400*200/500=160,这样处理是没啥大问题,就是在页面上表示的时候,会出现个排列比较难处理.有处理过的朋友们应该会记得那个苦恼.
3.就是我按我要的宽跟高,例如是300*300把一张图片例如400*500把这个切300*300出来.剩下的都放弃.这样缩略会让用户上传的图,其中一部分看不到.
我想出一个方法,算是个折衷的方法吧,就是网页上通常都是需求固定大小的缩略图,如果我在一个资讯板块中,把无论宽跟高的所有图片都要缩略出一张200*200来当资讯图片,用第1种缩略方法有可能会把图片变形,用第二种方法没办法缩略成200*200的图片,用第三种会把图片的元素丢失.所以我觉得比较好的处理方法是这样:先画一张200*200白底的图片,再判断图片的宽跟高哪边大,假设高>宽,那就按高缩略,再把这缩略的图片以居中的方式放到那个200*200的白底图片上,完成缩略.
代码如下
/// 生成缩略图
/// </summary>
/// <param name="originalImagePath">源图路径(物理路径)</param>
/// <param name="thumbnailPath">缩略图路径(物理路径)</param>
/// <param name="destLengthwidth">缩略图宽度高度</param>
public static void MakeThumbnail( string originalImagePath, string thumbnailPath, int destLength ) {
Image originalImage = Image.FromFile(originalImagePath);
int ow = originalImage.Width;
int oh = originalImage.Height;
if (ow > oh) {
oh = oh * destLength / ow;
ow = destLength;
}
else {
ow = ow * destLength / oh;
oh = destLength;
}
int x = (destLength - ow) / 2;
int y = (destLength - oh) / 2;
Image bitmap = new System.Drawing.Bitmap(destLength, destLength);
//新建一个画板
Graphics g = System.Drawing.Graphics.FromImage(bitmap);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//清空画布并以透明背景色填充
g.Clear(Color.White);
//在指定位置并且按指定大小绘制原图片的指定部分
g.DrawImage(originalImage, x, y, ow, oh);
try {
//以jpg格式保存缩略图
bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
}
catch (System.Exception e) {
throw e;
}
finally {
originalImage.Dispose();
bitmap.Dispose();
g.Dispose();
}
}
这个方法是缩略了同样的高跟宽..如果有需求缩略成不同的宽跟高的话,只要稍微修改一下就可以用了.