zoukankan      html  css  js  c++  java
  • 真正生成高质量不变形缩略图片 dodo

    /// <summary>
       /// 生成缩略图
       /// </summary>
       /// <param name="originalImagePath">源图路径(物理路径)</param>
       /// <param name="thumbnailPath">缩略图路径(物理路径)</param>
       /// <param name="width">缩略图宽度</param>
       /// <param name="height">缩略图高度</param>
       /// <param name="mode">生成缩略图的方式</param>   
       public static void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
       {
        Image originalImage = Image.FromFile(originalImagePath);
               
        int towidth = width;
        int toheight = height;
           
        int x = 0;
        int y = 0;
        int ow = originalImage.Width;
        int oh = originalImage.Height;       

        switch (mode)
        {       
         case "HW"://指定高宽缩放(可能变形)               
          break;
         case "W"://指定宽,高按比例                   
          toheight = originalImage.Height * width/originalImage.Width;
          break;
         case "H"://指定高,宽按比例
          towidth = originalImage.Width * height/originalImage.Height;                   
          break;       
         case "Cut"://指定高宽裁减               
          if((double)originalImage.Width/(double)originalImage.Height > (double)towidth/(double)toheight)
          {
           oh = originalImage.Height;
           ow = originalImage.Height*towidth/toheight;
           y = 0;
           x = (originalImage.Width - ow)/2;
          }
          else
          {
           ow = originalImage.Width;
           oh = originalImage.Width*height/towidth;
           x = 0;
           y = (originalImage.Height - oh)/2;
          }
          break;
         case "CutA"://指定高宽裁减(不变形)自定义
          if(ow<=towidth&&oh<=toheight)
          {
           x=-(towidth-ow)/2;
           y=-(toheight-oh)/2;
           ow=towidth;
           oh=toheight;
          }
          else
          {
           if(ow>oh)//宽大于高
           {
            x=0;
            y=-(ow-oh)/2;
            oh=ow;
           }
           else//高大于宽
           {
            y=0;
            x=-(oh-ow)/2;
            ow=oh;
           }
          }
          break;
         default :
          break;
        }   
               
        //新建一个bmp图片
        Image bitmap = new System.Drawing.Bitmap(towidth,toheight);

        //新建一个画板
        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, new Rectangle(0, 0, towidth, toheight),
         new Rectangle(x, y, ow,oh),
         GraphicsUnit.Pixel);

        try
        {           
         //以jpg格式保存缩略图
         bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch(System.Exception e)
        {
         throw e;
        }
        finally
        {
         originalImage.Dispose();
         bitmap.Dispose();                       
         g.Dispose();
        }
       }

  • 相关阅读:
    弹性布局----Flex
    mysql多实例双主部署
    你知道你的类是从什么地方加载来的吗?
    ElasticSearch学习,入门篇(一)
    Spring声明式事物原理分析
    SpringBoot启动流程分析
    Spring Aop 原理分析
    Spring容器的创建原理
    你可能不知道的jvm的类加载机制
    面向工资编程的程序员,后来都过得怎么样。
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1281886.html
Copyright © 2011-2022 走看看