ImageMagick.MagickResourceLimitErrorException:'TooManyExceptions(异常处理已暂停)

时间:2019-01-10 05:15:55

标签: c# imagemagick imagemagick.net

我收到此错误:

ImageMagick.MagickResourceLimitErrorException: 'TooManyExceptions (exception processing is suspended) @ error/exception.c/ThrowException/969'

在此行

using (MagickImageCollection tiffPageCollection = new MagickImageCollection())
{
    tiffPageCollection.Read(tifName);  // fails here.
}

发生此问题是因为92页的tif在每个页面上都出现三个错误:

{"ASCII value for tag \"Copyright\" does not end in null byte. `TIFFFetchNormalTag' @ warning/tiff.c/TIFFWarnings/1007"}    ImageMagick.MagickException {ImageMagick.MagickCoderWarningException}

超出警告错误的数量,因此会触发TooManyExceptions错误。

此URL暗示一种解决方案:

http://www.imagemagick.org/discourse-server/viewtopic.php?t=33989

添加此处理程序:

private void MagickNET_Log (object sender, LogEventArgs e)
{
    // write to a single log file...
    if ((RemoteImageMagickEventLogging & e.EventType) != LogEvents.None)
    {
        switch (e.EventType)
        {
        case LogEvents.Exception:
            if (!e.Message.Contains ("TIFFWarnings"))
            {
                 TriggerRemoteLoggingEvent (e.EventType, 
                     EZLogger.LoggingLevel.Note1, e.Message);
            }
            break;
        }
    }
}

它还引用了此异常已添加到“ ImageMagick.Net 7.4.5 Q8 AnyCPU”中,并且在较早版本中未发生。我在更新到v7.10.0的“ ImageMagick.Net-Q16-AnyCPU v7.9.1”上遇到问题,仍然有同样的问题。

所以,我的问题是:

  1. ImageMagick的哪些版本具有和不具有此功能?

  2. 将该处理程序交给我的代码有哪些步骤?

  3. 是否可以增加允许的最大警告数量,而我可以将该限制提高到一个很高的水平,以至于我不会触及它?

2 个答案:

答案 0 :(得分:1)

  

ImageMagick的哪些版本具有和不具有此功能?

changelog开始,它最早是在7.0.7-22版中添加的。解决此功能的工作是针对Google's OSS-fuzz project

  

有没有办法增加允许的最大警告数量,而我可以将该限制提高到一个很高的水平,以至于我不会达到它?

目前不行。该限制被硬编码为MagickCore/exception.c为...

#define MaxExceptionList 64

但这是开源的,是一个相当新的功能。如果您在“错误” message board下发布问题,则可以使开发人员修改该限制,或者允许polices.xml下的某些资源属性由用户控制。呈现真实的测试用例也有帮助,带有64个以上警告的tiff文件应进行一定程度的审查。

答案 1 :(得分:1)

Magic.NET 7.10.1.0:https://github.com/dlemstra/Magick.NET/releases/tag/7.10.1.0已解决此问题。 TooManyExceptions (exception processing is suspended)异常将不再引发,因为它已更改为警告。