C# Magick.Net中使用SVG时出现“没有为此图像格式解码委托”的错误

3
我安装了 ImageMagick-6.8.9-Q16,并成功运行了 convert test.svg test.pdf 命令,得到了有效的 pdf 输出。
在我的项目中,我安装了 Magick.NET-Q16-x86 版本 7.0.0.003,并且可以成功使用它来转换其他格式。
然而,当我运行以下代码时,会出现“iisexpress.exe:没有解码此图像格式的代理”错误:
using (var image = new MagickImage(File.OpenRead("C:\\Temp\\SvgToPdf\\test.svg"))) //error here
{
    image.Format = MagickFormat.Pdf;
    image.Write("C:\\Temp\\SvgToPdf\\test.pdf");
}

有什么想法吗?
2个回答

4

哎呀,我也遇到了类似的问题。 Magick.NET在从流创建MagickImage对象时抛出“ImageMagick.MagickMissingDelegateErrorException”错误,错误消息为“no decode delegate for this image format `' @ error/blob.c/CustomStreamToImage/761”。 当我将流保存到文件中时,图片完全正常。

经过近两天的调试和尝试,我认识到,同一流有时会抛出这个错误,有时不会... ->问题在于流的状态。在创建MagickImage之前,它必须被定位到开头!也许这是ImageMagick的错误,因为... :-/

    public ResizedImageWithMetadata GetResizedImageWithMetadata(Stream content,..)
        {
            try
            {
                if (content == null)
                {
                    throw new ArgumentNullException($"Image content is empty!");
                }
                using (MagickImage image = new MagickImage(content))
                {
// unexpected exception...

正确:

public ResizedImageWithMetadata GetResizedImageWithMetadata(Stream content,..)
    {
        try
        {
            if (content == null)
            {
                throw new ArgumentNullException($"Image content is empty!");
            }
            content.Seek(0, SeekOrigin.Begin); //THIS IS NEEDED!!!
            using (MagickImage image = new MagickImage(content))
            {

4

糟糕...你知道我发帖几分钟后就会想出答案...这就是为什么我不问太多问题的原因!

无论如何,对于那些想知道的人,问题出在使用File.OpenRead打开文件上(可能没有FileStream中所有必要的信息)。将我的代码更改为以下内容即可解决:

using (var image = new MagickImage("C:\\Temp\\SvgToPdf\\test.svg"))
{
    image.Format = MagickFormat.Pdf;
    image.Write("C:\\Temp\\SvgToPdf\\test.pdf");
}

感谢dlemstra提供的替代方案,当您确实需要使用Stream时,这个方案非常有用!

var readSettings = new MagickReadSettings() { Format = MagickFormat.Svg };
var image = new MagickImage(svgStream, readSettings);

4
您说得对,ImageMagick无法从流中检测出svg格式。如果您想使用流,则应在MagickImage构造函数中传递一个带有格式属性设置为MagickFormat.Svg的MagickReadSettings实例。 - dlemstra
1
@dlemstra,这非常好知道,因为我将来肯定想要使用流! - Bradley Mountford

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接