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


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

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

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

    这就是想与做的不同.

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

    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();
        }
    }

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

  • 相关阅读:
    markdown样式代码保存
    【python系统学习08】for循环知识点合集
    【python系统学习07】一张图看懂字典并学会操作
    【python系统学习06】一张图看懂列表并学会操作
    java后端学习记录
    支付功能设计及实现思路
    《Kafka权威指南》读书笔记
    ReentrantLock源码简析
    敏捷开发流程
    上线新功能,如何兼容旧数据?
  • 原文地址:https://www.cnblogs.com/yans/p/1691393.html
Copyright © 2020-2023  润新知