• C#图片处理之:图片缩放和剪裁


    一、C#图片处理之:图片缩放和剪裁 封装

    此代码是针对.net core 的

    使用如下:

            public static void ImgOne()
            {
                // Image
    
                //  Bitmap
    
                ImageOperate.Cut(@"E:\MyDll\QLCommon\test\1.jpg", @"E:\MyDll\QLCommon\test\11.jpg",100, 100);
                Console.WriteLine("操作成功");
            }

    结果如下:

    二、代码封装如下:

     /// <summary>
        /// 图片处理使用封装
        /// </summary>
        public class ImageOperate
        {
            /// <summary>
            /// 图片剪切,固定格式jpg
            /// 最大化缩放
            /// </summary>
            /// <param name="source"></param>
            /// <param name="target"></param>
            /// <param name="width"></param>
            /// <param name="height"></param>
            /// <exception cref="Exception"></exception>
            public static void Cut(string source, string target, int width, int height)
            {
                //
                if (File.Exists(source) == false)
                    throw new Exception("图片文件不存在");
                Image img = Bitmap.FromFile(source);
                //图片缩放
                int realWidth = 0,
                    realHeight = 0,
                    realLeft = 0,
                    realTop = 0;
                if (img.Width > img.Height)
                {
                    realHeight = height;
                    realWidth = Convert.ToInt32(height * 1.0 / img.Height * img.Width);
                    realLeft = (img.Width - realWidth) / 2;
                    realTop = 0;
                }
                else
                {
                    realWidth = width;
                    realHeight = Convert.ToInt32(width * 1.0 / img.Width * img.Height);
                    realLeft = 0;
                    realTop = (img.Height - realHeight) / 2;
                }
                Bitmap oldMap = ResizeBitmap(new Bitmap(img), realWidth, realHeight);
                int left = Convert.ToInt32((oldMap.Width - width) / 2.0);
                int top = Convert.ToInt32((oldMap.Height - height) / 2.0);
                //剪切
                Bitmap map = CutBitmap(oldMap, left, top, width, height);
    
                //保存到磁盘
                map.Save(target, ImageFormat.Jpeg);
            }
            /// <summary>
            /// 等比例缩放图片
            /// </summary>
            /// <param name="bmp"></param>
            /// <param name="newW"></param>
            /// <param name="newH"></param>
            /// <returns></returns>
            public static Bitmap ResizeBitmap(Bitmap bmp, int newW, int newH)
            {
                try
                {
                    Bitmap b = new Bitmap(newW, newH);
                    Graphics g = Graphics.FromImage(b);
                    // 插值算法的质量
                    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                    g.DrawImage(bmp, new Rectangle(0, 0, newW, newH),
                        new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
                    g.Dispose();
                    return b;
                }
                catch
                {
                    return null;
                }
            }
            /// <summary>
            /// 剪裁 -- 用GDI+
            /// </summary>
            /// <param name="b">原始Bitmap</param>
            /// <param name="StartX">开始坐标X</param>
            /// <param name="StartY">开始坐标Y</param>
            /// <param name="iWidth">宽度</param>
            /// <param name="iHeight">高度</param>
            /// <returns>剪裁后的Bitmap</returns>
            public static Bitmap CutBitmap(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)
            {
                if (b == null)
                {
                    return null;
                }
    
                int w = b.Width;
                int h = b.Height;
    
                if (StartX >= w || StartY >= h)
                {
                    return null;
                }
    
                if (StartX + iWidth > w)
                {
                    iWidth = w - StartX;
                }
    
                if (StartY + iHeight > h)
                {
                    iHeight = h - StartY;
                }
    
                try
                {
                    Bitmap bmpOut = new Bitmap(iWidth, iHeight, PixelFormat.Format24bppRgb);
                    Graphics g = Graphics.FromImage(bmpOut);
                    g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight),
                        new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
                    g.Dispose();
                    return bmpOut;
                }
                catch
                {
                    return null;
                }
            }
        }

    更多:

    GDI+ 位图介绍

    .Net Core GDI+ 使用基础

    C# 实现中文转颜色 - 实现根据名字自动生成头像

  • 相关阅读:
    relative 和 absolute 定位关系
    基于Linux的Samba开源共享解决方案测试(四)
    基于Linux的Samba开源共享解决方案测试(三)
    基于Linux的Samba开源共享解决方案测试(二)
    基于Linux的Samba开源共享解决方案测试(一)
    创建文件测试
    RHEL6.x查看网卡槽位对应设备文件及路径
    linux I/O优化 磁盘读写参数设置
    20个Linux服务器性能调优技巧
    Linux文件读写机制及优化方式
  • 原文地址:https://www.cnblogs.com/tianma3798/p/16889800.html
Copyright © 2020-2023  润新知