C#中如何将Image按指定区域复制到Bitmap的指定位置?
高效实现图片区域复制到Bitmap的方案
哈哈,这种找不对关键词的烦恼我太懂了!其实你完全不用靠逐像素写入这种低效方式,用GDI+的Graphics类搭配DrawImage重载就能完美实现需求,而且性能是原生优化过的。
核心思路
Bitmap本身负责存储图像数据,而Graphics类提供了所有绘制操作的接口,其中DrawImage有专门的重载支持从源图像的指定区域,复制到目标Bitmap的指定位置,完全匹配你想要的功能。
具体实现代码(C#示例)
// 从磁盘加载源图片(tree) using var treeImage = Bitmap.FromFile(@"path\to\your\tree.png"); // 创建或获取目标Bitmap(forest),这里示例新建一个1920x1080的大图 using var forestBitmap = new Bitmap(1920, 1080); // 创建关联目标Bitmap的Graphics对象,用来执行绘制操作 using var g = Graphics.FromImage(forestBitmap); // 调用DrawImage重载,实现精准的区域复制 // 参数说明: // 1. 源图像(treeImage) // 2. 目标区域:在forestBitmap上的位置(positionXonBitmap, positionYonBitmap)和大小(ImageLength, ImageWidth) // 3. 源区域:从treeImage上截取的起始位置(startPositionXImage, startPositionYImage)和大小(ImageLength, ImageWidth) // 4. 单位:这里用像素(GraphicsUnit.Pixel) g.DrawImage( treeImage, new Rectangle(positionXonBitmap, positionYonBitmap, ImageLength, ImageWidth), new Rectangle(startPositionXImage, startPositionYImage, ImageLength, ImageWidth), GraphicsUnit.Pixel ); // 操作完成后,可将forestBitmap保存到磁盘或继续其他编辑 forestBitmap.Save(@"path\to\save\forest.png");
为什么这比SetPixel好?
- 性能碾压:
DrawImage是底层优化过的绘制操作,会利用内存块复制甚至硬件加速,比逐像素调用SetPixel快几个数量级,尤其是处理大图片时差距更明显。 - 代码简洁:一行核心调用就搞定,不用写循环处理像素的冗余代码。
- 扩展性强:如果后续需要添加透明度、混合模式、缩放等需求,只需要调整
Graphics的属性(比如CompositingMode、InterpolationMode)即可。
额外注意事项
- 记得用
using语句包裹Bitmap和Graphics对象,确保资源自动释放,避免内存泄漏。 - 如果源区域和目标区域的宽高不一致,
DrawImage会自动帮你缩放图像到目标大小,适合需要调整尺寸的场景。 - 除了从磁盘加载图片,也可以用
Image.FromStream从流中加载,适配不同的图片来源场景。
内容的提问来源于stack exchange,提问作者TheRealLife
相关产品推荐
相关产品推荐

