方法二(
原帖地址:同方法一,做了一些修改):
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
ImageCut
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
private Image ImageCut(Image image, int x, int y, int width, int height)
{
Bitmap result = new Bitmap(width, height, PixelFormat.Format32bppArgb);
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
using (Graphics g = Graphics.FromImage(result))
{
Rectangle destRect = new Rectangle(0, 0, width, height);
g.DrawImage(image, destRect, x, y, width, height, GraphicsUnit.Pixel);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return result;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
两种方法的比较:
两种方法生成的图片是一样的,区别在于所用的时间;为此我做了几个测试:当取一张分辨率为2592X1944、大小为2.09M的图片作为原始图片时,方法一用时436.5毫秒,方法二为333.2毫秒;而当图片大到分辨率为6404X4724、大小为25.1M的时候,方法一用时3485.0毫秒,方法二用时2758.8毫秒,两者相差超过半秒钟;可以预见,图片越大,方法二的速度优势越明显;因此,如果从节省时间资源的角度考虑,应该选用方法二。
更正: 由于编写代码上的疏忽,导致原先对切割图片的时间计算是错误的;同时对于方法一再次做了修改,代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
ImageCut
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public Image ImageCut(Bitmap bitmap, float x, float y, float width, float height)
{
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (x + width > bitmap.Width)
{
width = bitmap.Width - x;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (y + height > bitmap.Height)
{
height = bitmap.Height - y;
}
RectangleF rect = new RectangleF(x, y, width, height);
PixelFormat format = bitmap.PixelFormat;
Bitmap result = bitmap.Clone(rect, format);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
return result;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
由于此方法的切割采用了Bitmap对象的Clone()方法,因此我将传入的参数做了相应的修改,并将其切割精度扩大到小数级别;排除所有干扰后重新对两个方法进行耗时测试,结果为:当取一张分辨率为2592X1944、大小为2.09M的图片作为原始图片时,方法一用时5.1毫秒左右,方法二为46毫秒左右;而当图片大到分辨率为6404X4724、大小为25.1M的时候,方法一仅用时5.8毫秒左右,方法二用时240毫秒左右;可见,方法一的速度优势是极其明显的;究其原因,方法一采用了Bitmap对象的Clone,而方法二将大量的时间耗在了DrawImage上;因此,方法一在切割图片的时间资源占用上是非常非常小的,或许已经达到了GDI+所能做到的极限;当然,或许还不是;所以我会继续研究下去的,也不能再犯之前不够细致的错误了,嘿嘿~