MagickImageCollection添加同一图片报错,如何避免重复加载?
解决MagickImageCollection添加同一张图片抛出异常的问题
问题描述
使用ImageMagick.MagickImageCollection类的.Add()方法插入同一张图片时,添加第二张会抛出异常:
System.InvalidOperationException: 'Not allowed to add the same image to the collection.'
由于重复从文件加载图片会消耗大量处理时间,需要一种无需重复加载即可实现重复添加同一张图片到集合的方法。
环境信息
- OS: Windows10
- IDE: Visual Studio 2022
- 语言: C#
- API: .Net 6.0
- 库: Magick ++, Ghostscript
相关代码
using System; public class Program { public static void Main() { ImageMagick.MagickImage img = new ImageMagick.MagickImage("input.HEIC"); ImageMagick.MagickImageCollection images = new ImageMagick.MagickImageCollection(); images.Add(img); // 此处添加第二张时抛出异常 images.Add(img); images.Add(img); images.Add(img); images.Add(img); images.Write("output.pdf"); img.Dispose(); images.Dispose(); Console.WriteLine("終了"); Console.ReadKey(); } }
解决方案
使用MagickImage.Clone()方法创建原图像的内存副本,既避免重复从磁盘加载图片,又满足集合需要不同实例的要求。
修改后的代码
using System; public class Program { public static void Main() { using (ImageMagick.MagickImage img = new ImageMagick.MagickImage("input.HEIC")) using (ImageMagick.MagickImageCollection images = new ImageMagick.MagickImageCollection()) { // 每次添加时克隆原图像的内存副本 images.Add(img.Clone()); images.Add(img.Clone()); images.Add(img.Clone()); images.Add(img.Clone()); images.Add(img.Clone()); images.Write("output.pdf"); Console.WriteLine("終了"); Console.ReadKey(); } } }
说明
Clone()方法会在内存中创建独立的MagickImage实例,但复用原图像的像素数据,比重新从磁盘加载文件高效得多,不会额外消耗大量处理时间。- 使用
using语句可自动处理资源释放,无需手动调用Dispose(),代码更简洁安全。 - 集合中的克隆实例会在
MagickImageCollection被释放时自动清理,无需单独处理。
内容的提问来源于stack exchange,提问作者user12419619
相关产品推荐
相关产品推荐

