以往做图片缩放的时候都是对原图片完整进行缩放,但是这样会造成图片周围有白边产生,但是有的客户希望图片无拉伸但是仍然填满缩放区域,这样只好对图片进行剪裁,但是以图片的左上方顶点为原点进行剪裁往往会剪掉一些需要的区域,一搬拍照都是把需要的部分拍在最中间,所以下面的算法是进行两端剪裁,代码如下:
1 /// <summary> 2 /// 生成缩略图并剪裁算法 3 /// </summary> 4 /// <param name="pathImageFrom">原始图片位置</param> 5 /// <param name="pathImageTo">生成图片存放位置</param> 6 /// <param name="width">生成图片的宽度</param> 7 /// <param name="height">生成图片的高度</param> 8 public void GenThumbnail(string pathImageFrom, string pathImageTo, int width, int height) 9 { 10 Image imageFrom = null; 11 try 12 { 13 imageFrom = Image.FromFile(pathImageFrom); 14 } 15 catch 16 { 17 throw new FileNotFoundException("图片不存在!"); 18 } 19 if (imageFrom == null) 20 { 21 return; 22 } 23 // 原始图片的宽度及高度 24 int imageFromWidth = imageFrom.Width; 25 int imageFromHeight = imageFrom.Height; 26 27 // 需要生成的缩略图在上述"画布"上的起点位置 28 int X = 0; 29 int Y = 0; 30 // 根据原始图片及欲生成的缩略图尺寸,计算缩略图的实际尺寸及原始图片需要裁剪后的左边或上面坐标 31 if (height * imageFromWidth > width * imageFromHeight) 32 { 33 X = (imageFromWidth - width * imageFromHeight / height) / 2; 34 } 35 else 36 { 37 Y = (imageFromHeight - height * imageFromWidth / width) / 2; 38 } 39 //图片经过缩放剪裁后的宽和高 40 int W = 0; 41 int H = 0; 42 W = X > 0 ? imageFromWidth - X * 2 : imageFromWidth; 43 H = Y > 0 ? imageFromHeight - Y * 2 : imageFromHeight; 44 // 创建画布 45 Bitmap bmp = new Bitmap(width, height); 46 Graphics g = Graphics.FromImage(bmp); 47 // 用白色清空 48 g.Clear(Color.White); 49 // 指定高质量的双三次插值法。执行预筛选以确保高质量的收缩。此模式可产生质量最高的转换图像。 50 g.InterpolationMode = InterpolationMode.HighQualityBicubic; 51 // 指定高质量、低速度呈现。 52 g.SmoothingMode = SmoothingMode.HighQuality; 53 // 在指定位置并且按指定大小绘制指定的 Image 的指定部分。 54 g.DrawImage(imageFrom, new Rectangle(0, 0, width, height), new Rectangle(X, Y, W, H), GraphicsUnit.Pixel); 55 try 56 { 57 //经测试 .jpg 格式缩略图大小与质量等最优 58 bmp.Save(pathImageTo, ImageFormat.Jpeg); 59 } 60 catch 61 { 62 63 } 64 finally 65 { 66 //显示释放资源 67 imageFrom.Dispose(); 68 bmp.Dispose(); 69 g.Dispose(); 70 } 71 }