C#裁剪图像的几种方法总结

前言

我们在上位机软件开发过程中经常需要裁剪图像,本文就是对c#中常见的裁剪图像方法进行总结。

1、克隆

直接调用Bitmap的Clone函数,然后指定需要裁剪的区域即可裁剪图像,该种方法不会损失精度

csharp 复制代码
 public static Bitmap CropImage_Clone(Bitmap origBitmap, Rectangle rectangle, out bool result)
        {
            result = false;
            Bitmap croppedBitmap = null;
            try
            {
                croppedBitmap = origBitmap.Clone(rectangle, origBitmap.PixelFormat);
                result = true;
            }
            catch (Exception ex)
            {

            }
            return croppedBitmap;
        }

2、gdi绘图(低质量)

使用gdi绘图的方式,优点是除了将原始图像根据指定区域裁剪外,而且可以在新的图像上绘制直线、矩形等图形,但是可能会丢失精度。

csharp 复制代码
   public static Bitmap CropImage_Gdi_LowerQuality(Bitmap origBitmap, Rectangle rectangle, out bool result)
        {
            result = false;
            Bitmap screenShot = new Bitmap(rectangle.Width, rectangle.Height);
            screenShot.SetResolution(origBitmap.HorizontalResolution, origBitmap.VerticalResolution);
            try
            {
                Graphics graphics = Graphics.FromImage(screenShot);
                graphics.DrawImage(origBitmap, 0, 0, rectangle, GraphicsUnit.Pixel);//这里的0,0指的是rectangle矩形图像在新图像中的左上角坐标,如果是截图片则就使用0,0
                result = true;
            }
            catch (Exception ex)
            {

            }
            return screenShot;
        }

3、gdi绘图(高质量)

使用gdi绘图的方式有时候会发现绘制的线条出现了锯齿等,这时候可以通过设置SmoothingMode 属性,这里设置为HighQuality来抵抗锯齿的出现,缺点是计算时间会变长,相当于提高了精度损失了效率。

csharp 复制代码
 public static Bitmap CropImage_Gdi_HighQuality(Bitmap origBitmap, Rectangle rectangle, out bool result)
    {
        result = false;
        Bitmap screenShot = new Bitmap(rectangle.Width, rectangle.Height);
        screenShot.SetResolution(origBitmap.HorizontalResolution, origBitmap.VerticalResolution);
        try
        {
            Graphics graphics = Graphics.FromImage(screenShot);
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.DrawImage(origBitmap, 0, 0, rectangle, GraphicsUnit.Pixel);//这里的0,0指的是rectangle矩形图像在新图像中的左上角坐标,如果是截图片则就使用0,0
            result = true;
        }
        catch (Exception ex)
        {

        }
        return screenShot;
    }

调用

下面的代码中原始图像如下:

裁剪后的图像如下:

也就是裁剪出一半大小的图像。并且也可以根据打印出来的信息看到三种方法的执行时间都不相同,使用克隆是速度最快的方法。

csharp 复制代码
Bitmap bitmap = new Bitmap(@"test.jpg");
            Rectangle cropArea = new Rectangle(0, 0, bitmap.Width / 2, bitmap.Height); // 示例裁剪区域
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Restart();

            bool result = false;
            Bitmap cropImage_Clone = CropImage_Clone(bitmap, cropArea, out result);
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
            cropImage_Clone.Save("cropImage_Clone.bmp",ImageFormat.Jpeg    );

            stopwatch.Restart();

            Bitmap cropImage_Gdi_LowerQuality = CropImage_Gdi_LowerQuality(bitmap, cropArea, out result);
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
            cropImage_Gdi_LowerQuality.Save("cropImage_Gdi_LowerQuality.bmp", ImageFormat.Jpeg  );


            Bitmap cropImage_Gdi_HighQuality = CropImage_Gdi_HighQuality(bitmap, cropArea, out result);
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
            cropImage_Gdi_HighQuality.Save("cropImage_Gdi_HighQuality.bmp", ImageFormat.Jpeg);

总结:

1、对于不需要额外绘制图形的场景直接使用克隆方法

2、对于需要绘制图形的场景使用gdi高质量绘图方法。

相关推荐
C++ 老炮儿的技术栈10 小时前
我们在设计tcp协议时,要传一个字符串过去,报文:头十长度十内容,是否要把‘\0‘也填入,长度是否包含‘\0‘
开发语言·数据结构·c++·mfc·c
曹牧10 小时前
C#:24小时制时间
c#
传奇开心果编程10 小时前
【Rust入门练中学】第2课:变量、可变性与常量
开发语言·学习·rust
zr想努力10 小时前
从0开始配置Perforce4环境
开发语言
幸运小圣12 小时前
PointerEvent 常用属性与事件整理【JavaScript】
开发语言·javascript·ecmascript
长谷深风11112 小时前
评测AI Agent:三种裁判各司其职
java·大数据·开发语言·人工智能·ai agent
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day42|项目周开发技术汇总 1 思维导图复盘
java·开发语言·spring boot·学习·spring
君顾113 小时前
本地托管机构管理源码实战:需求拆解、数据建模与多端部署
java·开发语言·托管
传奇开心果编程14 小时前
【Rust入门练中学】 第3课:数据类型
开发语言·学习·rust
泡泡鱼(敲代码中)15 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee