You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:21:49