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高质量绘图方法。

相关推荐
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
ll7788115 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
Jackson@ML6 小时前
Python数据可视化简介
开发语言·python·数据可视化
赵琳琅6 小时前
Java语言的云计算
开发语言·后端·golang
lly2024067 小时前
jQuery 杂项方法
开发语言
赵琳琅7 小时前
MDX语言的安全开发
开发语言·后端·golang
开开又心心的学嵌入式7 小时前
C语言——指针进阶应用
c语言·开发语言
开开又心心的学嵌入式7 小时前
C语言——指针基础知识
c语言·开发语言
lonelyhiker7 小时前
javascript的原型链
开发语言·javascript·原型模式
夏梓蕙8 小时前
Elixir语言的软件开发工具
开发语言·后端·golang