2016-12-21 51 views
0

Возможно, я плохо формулирую этот вопрос, но я стараюсь следовать документации библиотеки 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 

Update: кажется актуальная проблема, у меня есть окно предварительного просмотра, которая содержит фоновое изображение изображения, которое будет сохранено. Последующие прогоны рушится. Удаление области предварительного просмотра позволяет записывать файл много раз, но неуверенность в том, что область предварительного просмотра имеет проблему (ее панель управления с контролем фонового изображения). Я пробовал установку нулевого/распоряжения/& 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; 
+7

Какая ошибка возникает у вас? – SLaks

+0

из любопытства, все равно сбой, если вы используете (результат MagickImage = новый MagickImage («blarg.png»)) вместо монтажа? –

+0

ошибка добавлен в оригинале вопрос. –

ответ

2

Image.FromFile заблокирует файл. Вы должны сделать что-то вроде приведенного ниже примера, чтобы избежать блокировки.

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

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

А, это имеет смысл и работает, спасибо! Когда я попытался помещать в ячейку if, если не равен null, когда позже попытался ее присвоить, я получил исключение с нулевой ссылкой. Является ли метод 'use' лучшим способом обработки таких вещей, которые были против того, как я это делал? –