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
相关产品推荐
相关产品推荐

