C# 使用ImageMagick.net多次创建和保存图像时出现异常

C# 使用ImageMagick.net多次创建和保存图像时出现异常,c#,imagemagick,magick.net,C#,Imagemagick,Magick.net,也许我对这个问题的措辞很糟糕,但我正试图遵循ImageMagick.net库文档,我有一个基于用户输入生成文本的程序 它在第一次运行时效果很好,但程序在随后的几次运行时崩溃 如果我退出并重新启动,它会毫无阻碍地覆盖存在的上一个文件 using (MagickImageCollection images = new MagickImageCollection()) { MagickReadSettings readSettings = new MagickReadSettings()

也许我对这个问题的措辞很糟糕,但我正试图遵循ImageMagick.net库文档,我有一个基于用户输入生成文本的程序

它在第一次运行时效果很好,但程序在随后的几次运行时崩溃

如果我退出并重新启动,它会毫无阻碍地覆盖存在的上一个文件

using (MagickImageCollection images = new MagickImageCollection())
{
    MagickReadSettings readSettings = new MagickReadSettings()
    {
        BackgroundColor = MagickColors.None, // -background none
        FillColor = MagickColors.Black, // -fill black
        Font = "Helvetica-Condensed-Light", // -font Helvetica-Condensed-Light
        FontPointsize = 26 // -pointsize 26
    };

    // this being declared a second time is probably why it crashes.

    MagickImage image = new MagickImage("label:" + output, readSettings);
    image.RemoveAttribute("label"); // +set label
    images.Add(image);

    MontageSettings montageSettings = new MontageSettings()
    {
        BackgroundColor = MagickColors.None, // -background none
        Shadow = true, // -shadow
        Geometry = new MagickGeometry(5, 5, 0, 0) // -geometry +5+5
    };

    using (MagickImage result = images.Montage(montageSettings))
    {
        result.Write("blarg.png");
    }
}
由于上述函数的操作驻留在按钮事件处理程序中,因此如果第二次按下,它将被第二次声明,但我对C#还是比较陌生,并且不确定如何正确重写,因为我是根据他们的文档改编的

错误:

Exception thrown: 'ImageMagick.MagickCoderErrorException' in Magick.NET-Q8-x64.dll
Exception type ImageMagick.MagickCoderErrorException
Exception message: WriteBlob Failed `blarg.png' @ error/png.c/MagickPNGErrorHandler/1650
Stack trace:    at ImageMagick.MagickExceptionHelper.Check(IntPtr exception)
  at ImageMagick.MagickImage.NativeMagickImage.WriteFile(MagickSettings settings)
  at phVer.frmMain.btnGenerate_Click(Object sender, EventArgs e) in C:\Users\jweinraub\documents\visual studio 2015\Projects\phVer\phVer\Form1.cs:line 83
---BEGIN InnerException--- 
Exception type ImageMagick.MagickBlobErrorException
Exception message: unable to open image 'blarg.png': Permission denied @   error/blob.c/OpenBlob/2695
Stack trace: 
---END Inner Exception
更新:实际问题似乎是我有一个预览窗格,其中包含已保存图像的背景图像。随后的运行崩溃。删除预览窗格允许多次写入文件,但不确定预览窗格出现问题的原因(它是带有背景图像控件的面板控件)。我尝试设置为null/disposing/&c,但没有效果

/* Preview.BackgroundImage = Image.FromFile("blarg.png"); */
if ( Preview.BackgroundImage != null )
{
    Preview.BackgroundImage.Dispose();
    Preview.BackgroundImage = null;
    Preview.Dispose();
}
var image2 = (Bitmap)Image.FromFile("blarg.png", true);
Preview.BackgroundImage = image2;

Image.FromFile
将锁定该文件。您应该像下面的示例那样避免锁定

if (Preview.BackgroundImage != null)
  Preview.BackgroundImage.Dispose();

using (var bitmap = new Bitmap("blarg.png"))
{
  Preview.BackgroundImage = new Bitmap(bitmap);
}

Image.FromFile
将锁定该文件。您应该像下面的示例那样避免锁定

if (Preview.BackgroundImage != null)
  Preview.BackgroundImage.Dispose();

using (var bitmap = new Bitmap("blarg.png"))
{
  Preview.BackgroundImage = new Bitmap(bitmap);
}

您会遇到什么错误?出于好奇,如果您使用(MagickImage result=new MagickImage(“blarg.png”))而不是蒙太奇,它是否仍然会崩溃?错误添加在原始问题中。是的,结果会引发未经处理的异常。我怀疑是在程序还在运行时第二次按下按钮时重新声明了
MagickImage=new MagickImage
。看起来文件
blarg.png
可能被打开了。每次尝试写入不同的文件。会出现什么错误?出于好奇,如果使用(MagickImage result=new MagickImage(“blarg.png”))而不是蒙太奇,它是否仍会崩溃?错误添加在原始问题中。是的,结果会引发未经处理的异常。我怀疑是在程序还在运行时第二次按下按钮时重新声明了
MagickImage=new MagickImage
。看起来文件
blarg.png
可能被打开了。每次尝试写入不同的文件。啊,这很有意义,而且很有效,谢谢!当我尝试将dispose放入if not equals null块时,当它稍后尝试分配它时,我抛出了一个null引用异常。使用方法处理这类事情是否比我做的更好?啊,这很有道理,而且很有效,谢谢!当我尝试将dispose放入if not equals null块时,当它稍后尝试分配它时,我抛出了一个null引用异常。在处理这类事情时,
使用
方法是否比我做的更好?