前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站
前言
大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在上位机软件开发过程中经常需要裁剪图像,本文就是对c#中常见的裁剪图像方法进行总结。
1、克隆
直接调用Bitmap的Clone函数,然后指定需要裁剪的区域即可裁剪图像,该种方法不会损失精度
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绘图的方式,优点是除了将原始图像根据指定区域裁剪外,而且可以在新的图像上绘制直线、矩形等图形,但是可能会丢失精度。
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来抵抗锯齿的出现,缺点是计算时间会变长,相当于提高了精度损失了效率。
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;
}
调用
下面的代码中原始图像如下:
裁剪后的图像如下:
也就是裁剪出一半大小的图像。并且也可以根据打印出来的信息看到三种方法的执行时间都不相同,使用克隆是速度最快的方法。
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高质量绘图方法。
作者介绍
马工2017年硕士毕业,一直从事上位机软件开发工作,在我工作的第四年年薪突破了40万+,为了帮助跟我一样从底层出身的上位机软件工程师早日达到高级工程师的水平,早日找到30万+的工作,我根据多年项目经验,总结出了一系列可直接用于项目的C#上位机实战教程推荐给大家,目前在CSDN已经超过一千人订阅,如果你不甘贫庸,想像我一样早日拿到高薪,马工强烈推荐你早日学这套教程,雷军曾说这个世界上有99%的问题别人都遇到过,你要做的不是闷头干!而是找这个领域的专家问一下,这是最快速提升自己的方法!
年入30万+C#上位机实战必备教程推荐(点击下方链接即可访问文章)
1、《C#串口通信从入门到精通》
2、《C#与PLC通信从入门到精通 》
3、《C# Modbus通信从入门到精通》
4、《C#Socket通信从入门到精通 》
5、《C# MES通信从入门到精通》
6、《winform控件从入门到精通》