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

SixLabors.ImageSharp中Image实例复制及对象引用问题咨询

问题解答

为什么直接赋值会修改原图像?

在C#中,ImageSharp的Image是引用类型,不是值类型。当你执行Image result = initialImage时,并没有复制图像数据,只是让result和initialImage两个变量指向内存里同一个图像对象。后续调用result.Mutate()修改的是这个共享对象的内部状态,所以原图像initialImage也会跟着变化。

如何无多余操作复制图像到新实例?

在ImageSharp里,直接用不带参数的Clone()重载就能创建原图像的完整独立副本,不会附加任何多余的图像处理操作:

Image result = initialImage.Clone();

这个方法会完整复制原图像的像素数据、格式、尺寸等所有属性,生成一个和原图像完全相同但内存独立的新对象,后续修改result不会影响initialImage。

如果你的图像是特定像素格式(比如Image<Rgba32>),也可以通过构造函数直接复制:

Image<Rgba32> result = new Image<Rgba32>(initialImage);

不过无参数Clone()更通用,不需要指定具体像素类型。

修改后的完整代码示例

/// <summary>
/// 高亮图像上指定区域
/// </summary>
/// <param name="initialImage">要高亮的原始图像</param>
/// <param name="rectanglesToHighlight">需要高亮的区域</param>
/// <returns></returns>
public static Image Highlight(Image initialImage, params RectangleF[] rectanglesToHighlight)
{
      // 创建原图像的独立副本
      Image result = initialImage.Clone();
      // 遮罩颜色
      Color maskColor = Color.Red;
      // 创建与原图像尺寸一致的红色遮罩
      Image mask = new Image<Rgba32>(initialImage.Width, initialImage.Height, maskColor);
      // 用于绘制透明矩形的重绘画笔
      RecolorBrush brush = new RecolorBrush(maskColor, Color.Transparent, 1f);

      // 在遮罩上绘制透明矩形
      foreach(RectangleF rect in rectanglesToHighlight)
            mask.Mutate(x => x.Clear(brush, rect));

      // 将遮罩应用到副本图像
      result.Mutate(x => x.DrawImage(mask, PixelColorBlendingMode.Normal, 0.5f));

      return result;
}

内容的提问来源于stack exchange,提问作者Living4Memes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:06:55