从BMP图像指定位置复制200×200区域时rectBmp始终黑屏的问题求助
问题原因及修复方案
问题根源
你的DrawImage方法参数用错了。当前代码里的第二个参数是目标矩形,你指定的new Rectangle(x-100, y-100, rectWidth, rectHeight)是要把原图内容画到rectBmp的这个位置,但rectBmp本身只有200×200的尺寸,这个目标矩形的起始坐标大概率超出了rectBmp的范围,导致没有任何内容被绘制上去,所以rectBmp一直是初始的黑色背景。
修复后的代码
你需要用DrawImage的重载,明确指定原图中要截取的源矩形和要画到rectBmp的目标矩形(这里是整个rectBmp区域):
Bitmap originalBmp = new Bitmap("C:\\Users\\park\\Downloads\\imsi\\textImage.bmp"); int x = (int)P.X; int y = (int)P.Y; int rectWidth = 200; int rectHeight = 200; Bitmap rectBmp = new Bitmap(rectWidth, rectHeight); Graphics g = Graphics.FromImage(rectBmp); // 修正:第二个参数是目标矩形(填满整个rectBmp),第三个是源矩形(原图要复制的区域) g.DrawImage(originalBmp, new Rectangle(0, 0, rectWidth, rectHeight), new Rectangle(x - 100, y - 100, rectWidth, rectHeight), GraphicsUnit.Pixel); pictureBox1.Image = originalBmp; rectBmp.Save("C:\\Users\\park\\Downloads\\imsi\\result.bmp", ImageFormat.Bmp); // 释放资源,避免内存泄漏 g.Dispose(); rectBmp.Dispose(); originalBmp.Dispose();
补充说明
- 目标矩形用
new Rectangle(0,0,rectWidth,rectHeight)表示把截取的内容铺满整个rectBmp。 - 源矩形
new Rectangle(x-100, y-100, rectWidth, rectHeight)的逻辑是对的,是以x、y为中心截取200×200的区域。 - 一定要手动释放
Graphics和Bitmap资源,防止内存泄漏。
内容的提问来源于stack exchange,提问作者eater Sun
相关产品推荐
相关产品推荐

