.net等比缩放生成缩略图的方法

时间:2022-04-05 02:19:21

生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/// <summary>
   /// 为图片生成缩略图
   /// </summary>
   /// <param name="phyPath">原图片的路径</param>
   /// <param name="width">缩略图宽</param>
   /// <param name="height">缩略图高</param>
   /// <returns></returns>
   public System.Drawing.Image GetHvtThumbnail(System.Drawing.Image image, int width, int height)
   {
     Bitmap m_hovertreeBmp = new Bitmap(width, height);
     //从Bitmap创建一个System.Drawing.Graphics
     Graphics m_HvtGr = Graphics.FromImage(m_hovertreeBmp);
     //设置
     m_HvtGr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
     //下面这个也设成高质量
     m_HvtGr.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
     //下面这个设成High
     m_HvtGr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
     //把原始图像绘制成上面所设置宽高的缩小图
     Rectangle rectDestination = new Rectangle(0, 0, width, height);
 
     int m_width, m_height;
     if (image.Width * height > image.Height * width)
     {
       m_height = image.Height;
       m_width = (image.Height * width) / height;
     }
     else
     {
       m_width = image.Width;
       m_height = (image.Width * height) / width;
     }
 
     m_HvtGr.DrawImage(image, rectDestination, 0, 0, m_width, m_height, GraphicsUnit.Pixel);
 
     return m_hovertreeBmp;
   }

C#缩略图生成类,采用高质量插值法实现缩略图生成,高质量,低速度呈现平滑程度,可以保持缩略图纵横比,在获取缩略图的时候一开始就根据百分比获取图片的尺寸、根据设定的大小返回图片的大小,并高质量保存缩略图图片,为原图片设置EncoderParameters 对象。

以下为类文件,建议保存文件名为:ImageHelper.cs

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
namespace HtmlSnap
{
  public static class ImageHelper
  {
    /// 获取缩略图
    public static Image GetThumbnailImage(Image image, int width, int height)
    {
      if (image == null || width < 1 || height < 1)
        return null;
      // 新建一个bmp图片
      Image bitmap = new System.Drawing.Bitmap(width, height);
 
      // 新建一个画板
      using (Graphics g = System.Drawing.Graphics.FromImage(bitmap))
      {
 
        // 设置高质量插值法
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
 
        // 设置高质量,低速度呈现平滑程度
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        
        // 高质量、低速度复合
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        
 // 清空画布并以透明背景色填充
        g.Clear(Color.Transparent);
        
 // 在指定位置并且按指定大小绘制原图片的指定部分
        g.DrawImage(image, new Rectangle(0, 0, width, height),
          new Rectangle(0, 0, image.Width, image.Height),
          GraphicsUnit.Pixel);
        return bitmap;
      }
    }
    /// <summary>
    /// 生成缩略图,并保持纵横比
    /// </summary>
    /// <returns>生成缩略图后对象</returns>
    public static Image GetThumbnailImageKeepRatio(Image image, int width, int height)
    {
      Size imageSize = GetImageSize(image, width, height);
      return GetThumbnailImage(image, imageSize.Width, imageSize.Height);
    }
 
    /// <summary>
    /// 根据百分比获取图片的尺寸
    /// </summary>
    public static Size GetImageSize(Image picture, int percent)
    {
      if (picture == null || percent < 1)
        return Size.Empty;
 
      int width = picture.Width * percent / 100;
      int height = picture.Height * percent / 100;
 
      return GetImageSize(picture, width, height);
    }
    /// <summary>
    /// 根据设定的大小返回图片的大小,考虑图片长宽的比例问题
    /// </summary>
    public static Size GetImageSize(Image picture, int width, int height)
    {
      if (picture == null || width < 1 || height < 1)
        return Size.Empty;
      Size imageSize;
      imageSize = new Size(width, height);
      double heightRatio = (double)picture.Height / picture.Width;
      double widthRatio = (double)picture.Width / picture.Height;
      int desiredHeight = imageSize.Height;
      int desiredWidth = imageSize.Width;
      imageSize.Height = desiredHeight;
      if (widthRatio > 0)
        imageSize.Width = Convert.ToInt32(imageSize.Height * widthRatio);
      if (imageSize.Width > desiredWidth)
      {
        imageSize.Width = desiredWidth;
        imageSize.Height = Convert.ToInt32(imageSize.Width * heightRatio);
      }
      return imageSize;
    }
    /// <summary>
    /// 获取图像编码解码器的所有相关信息
    /// </summary>
    /// <param name="mimeType">包含编码解码器的多用途网际邮件扩充协议 (MIME) 类型的字符串</param>
    /// <returns>返回图像编码解码器的所有相关信息</returns>
    public static ImageCodecInfo GetCodecInfo(string mimeType)
    {
      ImageCodecInfo[] CodecInfo = ImageCodecInfo.GetImageEncoders();
      foreach (ImageCodecInfo ici in CodecInfo)
      {
        if (ici.MimeType == mimeType) return ici;
      }
      return null;
    }
    public static ImageCodecInfo GetImageCodecInfo(ImageFormat format)
    {
      ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
      foreach (ImageCodecInfo icf in encoders)
      {
        if (icf.FormatID == format.Guid)
        {
          return icf;
        }
      }
      return null;
    }
    public static void SaveImage(Image image, string savePath, ImageFormat format)
    {
      SaveImage(image, savePath, GetImageCodecInfo(format));
    }
    /// <summary>
    /// 高质量保存图片
    /// </summary>
    private static void SaveImage(Image image, string savePath, ImageCodecInfo ici)
    {
      // 设置 原图片 对象的 EncoderParameters 对象
      EncoderParameters parms = new EncoderParameters(1);
      EncoderParameter parm = new EncoderParameter(Encoder.Quality, ((long)95));
      parms.Param[0] = parm;
      image.Save(savePath, ici, parms);
      parms.Dispose();
    }
 
  }
}