使用 ImageMagick.net 多次创建和保存图像时出现异常
Exception creating and saving an image multiple times with ImageMagick.net
也许我对这个问题的措辞不佳,但我正在尝试遵循 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);
}
也许我对这个问题的措辞不佳,但我正在尝试遵循 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);
}