2016-12-21 6 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 

업데이트 : 실제 문제는 내가 저장됩니다 이미지의 배경 이미지를 포함하는 미리보기 창을 것 같다. 후속 실행이 충돌합니다. 미리보기 창을 제거하면 파일을 여러 번 쓸 수는 있지만 미리보기 창에 문제가있는 이유를 알 수 없습니다 (배경 이미지 제어가있는 패널 컨트롤). null/처분/& 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

무슨 에러가 발생합니까? 당신이 (MagickImage 결과 = 새로운 MagickImage ("blarg.png")) 대신 몽타주를 사용하는 경우 호기심 – SLaks

+0

, 여전히 충돌합니까? –

+0

원래 질문에서 오류가 추가되었습니다. –

답변

2

Image.FromFile 파일을 잠급니다. 자물쇠를 피하려면 아래 예와 같이해야합니다.

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

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

아, 그 말이 맞는, 작동, 감사합니다! null 블록과 같지 않은 if에 dispose를 넣으려고 시도했으나 나중에 할당하려고 시도했을 때 null 참조 예외가 발생했습니다. 'using' 메소드는 내가했던 방식에 반대하는 이런 종류의 것들을 처리하는 더 좋은 방법인가요? –