分享一个简单而实用的缩略图方法

不知道大家网站上的缩略图是怎么"缩"的呢?

马上又要开始一个新的项目,过来这个公司养成了一个新的习惯,就是会把遇到的一些实用的程序保存下来.

我想这是一个好习惯..以前只是觉得存起来有用.现在是实际做到这一步了:"把有用的程序都保存下来"

这就是想与做的不同.

 

现在缩略图基本上有几种方式:

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>
/// 生成缩略图
/// </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();
    }
}

 

 

这个方法是缩略了同样的高跟宽..如果有需求缩略成不同的宽跟高的话,只要稍微修改一下就可以用了.

posted @ 2010-03-22 10:10  yans  阅读(1244)  评论(5编辑  收藏  举报