C# 生成高质量缩略图程序—终极算法

  先看代码:

  using System;

  using System.Drawing;

  using System.Drawing.Imaging;

  using System.Drawing.Drawing2D;

  /**//// <summary>

  ///

  /// **生成高质量缩略图程序**

  ///

  ///  File: GenerateThumbnail.cs

  ///

  ///  Author: 周振兴 (Zxjay 飘遥)

  ///

  ///  E-Mail: [email protected]

  ///

  ///  Date: 07-04-07

  ///

  /// </summary>

  public class GenerateThumbnail

  ...{

  /**//// <summary>

  ///  生成缩略图 静态方法

  /// </summary>

  /// <param name="pathImageFrom"> 源图的路径(含文件名及扩展名) </param>

  /// <param name="pathImageTo"> 生成的缩略图所保存的路径(含文件名及扩展名)

  ///                            注意:扩展名一定要与生成的缩略图格式相对应 </param>

  /// <param name="width"> 欲生成的缩略图 "画布" 的宽度(像素值) </param>

  /// <param name="height"> 欲生成的缩略图 "画布" 的高度(像素值) </param>

  public static void GenThumbnail(string pathImageFrom,string pathImageTo,int width,int height)

  ...{

  Image imageFrom = null;

  try

  ...{

  imageFrom = Image.FromFile(pathImageFrom);

  }

  catch

  ...{

  //throw;

  }

  if (imageFrom == null)

  ...{

  return;

  }

  // 源图宽度及高度

  int imageFromWidth = imageFrom.Width;

  int imageFromHeight = imageFrom.Height;

  // 生成的缩略图实际宽度及高度

  int bitmapWidth = width;

  int bitmapHeight = height;

  // 生成的缩略图在上述"画布"上的位置

  int X = 0;

  int Y = 0;

  // 根据源图及欲生成的缩略图尺寸,计算缩略图的实际尺寸及其在"画布"上的位置

  if (bitmapHeight * imageFromWidth > bitmapWidth * imageFromHeight)

  ...{

  bitmapHeight = imageFromHeight * width / imageFromWidth;

  Y = (height - bitmapHeight) / 2;

  }

  else

  ...{

  bitmapWidth = imageFromWidth * height / imageFromHeight;

  X = (width - bitmapWidth) / 2;

  }

  // 创建画布

  Bitmap bmp = new Bitmap(width, height);

  Graphics g = Graphics.FromImage(bmp);

  // 用白色清空

  g.Clear(Color.White);

  // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。

  g.InterpolationMode = InterpolationMode.HighQualityBicubic;

  // 指定高质量、低速度呈现。

  g.SmoothingMode = SmoothingMode.HighQuality;

  // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。

  g.DrawImage(imageFrom, new Rectangle(X, Y, bitmapWidth, bitmapHeight), new Rectangle(0, 0, imageFromWidth, imageFromHeight), GraphicsUnit.Pixel);

  try

  ...{

  //经测试 .jpg 格式缩略图大小与质量等最优

  bmp.Save(pathImageTo, ImageFormat.Jpeg);

  }

  catch

  ...{

  }

  finally

  ...{

  //显示释放资源

  imageFrom.Dispose();

  bmp.Dispose();

  g.Dispose();

  }

  }

  }

  生成的缩略图大小一定,无剪裁、无变形。

  可以测试一下各种图形格式、图形质量、呈现方式生成的缩略图的大小和视觉质量。

  经测试:Vista 原默认桌面 .jpg 格式 尺寸:1024*768,

  生成原尺寸大小的缩略图,比较如下:

  原图.jpg格式,223 KB

  .jpg  102KB

  .png  1816 KB

  .gif  228 KB

  .tiff  2000KB 以上

  …

  视觉上 除 .gif 质量较差外,其他的与源图肉眼无法区别(本人有点近视^-^)

  在考虑到专利及通用性等因素,推荐用 .jpg 格式。