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

  • 相关阅读:
    dialog draggable
    sql删除重复数据
    winform截取屏幕并发送邮件
    TreeView 一些总结
    省市互连
    查找 ASP.NET 进程的名称
    不错的sql面试题
    在javascript中获取用户控件里的子控件的值;另打开新窗口传值回原窗口
    根据日期显示星期几
    不想让别人使用电脑某个软件的小技巧
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1281886.html
Copyright © 2011-2022 走看看