zoukankan      html  css  js  c++  java
  • 图片剪裁并生成缩略图算法

    以往做图片缩放的时候都是对原图片完整进行缩放,但是这样会造成图片周围有白边产生,但是有的客户希望图片无拉伸但是仍然填满缩放区域,这样只好对图片进行剪裁,但是以图片的左上方顶点为原点进行剪裁往往会剪掉一些需要的区域,一搬拍照都是把需要的部分拍在最中间,所以下面的算法是进行两端剪裁,代码如下: 

     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         }
    作者:Statmoon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Guava布隆过滤器实战应用
    结合阿里代码规范约定+源码剖析属性拷贝性能安全问题
    comparatorChain实现对Bean多字段排序
    python ibm_db模块的使用
    Linux6.5编译安装mysql5.7.19
    3.1 创建预配置管理资料数据库
    redis环境搭建及一主二从三哨兵模式配置
    一次生产环境搭建11g RAC的记录
    绑定变量
    oracle 10g 搭建备库以及一次DG GAP的处理情况
  • 原文地址:https://www.cnblogs.com/leolis/p/2597870.html
Copyright © 2011-2022 走看看