• 图片截取并缩放—以任意点为起点截取任意长度并缩放至指定大小算法


    直接上代码:

            /// <summary>
            /// 生成缩略图 
            /// </summary>
            /// <param name="pathImageFrom">源图的路径(含文件名及扩展名) </param>
            /// <param name="pathImageTo">生成的缩略图所保存的路径(含文件名及扩展名)</param>
            /// <param name="startw">前台截取宽起点</param>
            /// <param name="starth">前台截取高起点</param>
            /// <param name="getwidth">前台截取宽长度</param>
            /// <param name="getheight">前台截取高长度</param>
            /// <param name="width">欲生成的缩略图 "画布" 的宽度(像素值)</param>
            /// <param name="height">欲生成的缩略图 "画布" 的高度(像素值) </param>
        
            public void GenThumbnail(string pathImageFrom, string pathImageTo,int startw,int starth, int getwidth,int getheight, 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 * getwidth > bitmapWidth * getheight)
                {
                    bitmapHeight = getheight * width / getwidth;
                    Y = (height - bitmapHeight) / 2;
                }
                else
                {
                    bitmapWidth = getwidth * height / getheight;
                    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(startw, starth, getwidth, getheight), GraphicsUnit.Pixel);
                try
                {
                    //经测试 .jpg 格式缩略图大小与质量等最优 
                    bmp.Save(pathImageTo, ImageFormat.Jpeg);
                }
                catch
                {
                }
                finally
                {
                    //显示释放资源 
                    imageFrom.Dispose();
                    bmp.Dispose();
                    g.Dispose();
                }
            }
    作者:Statmoon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    机器学习-数据可视化神器matplotlib学习之路(四)
    [AspNetCore]CookieAuthentication禁用自动跳转到登录页
    [AspNetCore3.1] 使用Serilog记录日志
    [排序算法二]选择排序
    [排序算法一]冒泡排序
    Ocelot 网关 和 consul 服务发现
    AspNetCore3.0 和 JWT
    在AspNetCore3.0中使用Autofac
    【ElasticSearch+NetCore 第二篇】Nest封装
    【ElasticSearch+NetCore 第一篇】在Windows上安装部署ElasticSearch和ElasticSearch-head
  • 原文地址:https://www.cnblogs.com/leolis/p/2662373.html
Copyright © 2020-2023  润新知