.NET 5.0框架下截图裁剪代码在Bitmap初始化处失效的解决方法
.NET 5.0 截图裁剪功能的正确实现方案
你在.NET 5.0中尝试实现截图裁剪时,代码执行到using (Bitmap bitmap = new Bitmap(stream))后无法正常运行,原代码如下:
ITakesScreenshot screenshotDriver = driver as ITakesScreenshot; Screenshot screenshot = screenshotDriver.GetScreenshot(); MemoryStream stream = new MemoryStream(screenshot.AsByteArray); using (Bitmap bitmap = new Bitmap(stream)) { Rectangle Imagecrop = new Rectangle(10, 8, 1150, 593); Bitmap croppedimage = new Bitmap(Imagecrop.Width, Imagecrop.Height); using (Graphics g = Graphics.FromImage(croppedimage)) { g.DrawImage(bitmap, new Rectangle(0, 0, Imagecrop.Width, Imagecrop.Height), Imagecrop, GraphicsUnit.Pixel); } croppedimage.Save(strFileFullPath); }
问题分析与修正方案
原代码的核心问题包括:MemoryStream未重置读取位置、裁剪逻辑冗余且易出错、GDI+资源未完全释放。以下是优化后的实现:
ITakesScreenshot screenshotDriver = driver as ITakesScreenshot; if (screenshotDriver == null) { // 处理驱动不支持截图的场景 return; } Screenshot screenshot = screenshotDriver.GetScreenshot(); // 直接从截图字节数组创建Bitmap,避免手动流操作的位置问题 using (Bitmap bitmap = new Bitmap(new MemoryStream(screenshot.AsByteArray))) { Rectangle cropArea = new Rectangle(10, 8, 1150, 593); // 校验裁剪区域是否超出原图范围 if (cropArea.X < 0 || cropArea.Y < 0 || cropArea.X + cropArea.Width > bitmap.Width || cropArea.Y + cropArea.Height > bitmap.Height) { // 处理区域越界的情况 return; } // 使用Clone方法简化裁剪,自动继承原图像素格式 using (Bitmap croppedImage = bitmap.Clone(cropArea, bitmap.PixelFormat)) { croppedImage.Save(strFileFullPath); } }
关键改进点
- 增加驱动兼容性判断:提前校验
driver是否支持ITakesScreenshot接口,避免空引用异常 - 简化流操作:直接通过
MemoryStream构造函数传入字节数组,自动处理流的读取位置 - 优化裁剪逻辑:使用
Bitmap.Clone替代手动绘制,更高效且减少GDI+操作出错概率 - 完善边界校验:防止裁剪区域超出原图范围导致的异常
- 完整资源释放:所有GDI+对象用
using包裹,确保内存及时回收
排查方向(若仍有问题)
- 确认
driver实例有效且当前会话未中断 - 检查
strFileFullPath的写入权限与路径格式合法性 - 尝试直接保存原截图到文件,验证截图字节数组是否有效
内容的提问来源于stack exchange,提问作者sivaguru y v
相关产品推荐
相关产品推荐

