2011-04-29 19 views
2

다음 코드로 일반 GDI 오류가 발생합니다. 일반적으로 그것은 잘 준수하고 실행하지만 GDI + 오류로 인해 실패합니다. 이 문제를 해결할 수있는 방법이 있을까요, 아니면 수술을 사용하지 않고 스크린 샷을 찍는 방법일까요?일반 GDI + 오류

Public Function CopyImageFromScreen(region as Int32Rect) As BitmapSource 

    Dim img As New System.Drawing.Bitmap(region.Width, region.Height) 
    Dim gfx As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(img) 
    gfx.CopyFromScreen(region.X, region.Y, 0, 0, New System.Drawing.Size(region.Width, region.Height)) 
    img.LockBits(New System.Drawing.Rectangle(0, 0, img.Width, img.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, img.PixelFormat) 

    Dim hObject As IntPtr = img.GetHbitmap 'This Line Causes the Error 

    Dim WpfImage As BitmapSource = Interop.Imaging.CreateBitmapSourceFromHBitmap(hObject, IntPtr.Zero, _ 
     System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()) 

    Return WpfImage 

End Function 

답변

5

이 방법은 할당 된 리소스를 정리하지 않는다고 말할 수 있습니다. 이것이 도움이되지 않더라도 일회용 물체를 청소하고 GC에 의지하지 않는 것이 가장 좋습니다.

.NET Framework의 "클래식"이미지 지원 (즉, System.Drawing.Image)은 대부분 기본 GDI/GDI + 라이브러리에 대한 래퍼이며 관리되지 않는 리소스가 누출되기 쉽습니다.

나뿐만 아니라 명시 적으로 마침내 CreateBitmapSourceFromHBitmap이 실패 할 경우 차단 시도/안에 DeleteObject에 대한 상호 운용성 호출로 hObject 핸들을 삭제하는 using 블록에서 imggfx 객체를 포장한다 제안 무엇.

... 프레임 워크가 Image 클래스에서 GetHbitmap 메서드를 제공하지만 interop 코드없이 삭제할 수없는 이유는 수수께끼입니다. 자세한 내용은 GetHbitmap에서 MSDN 문서를 확인하십시오.

+0

확인했는데 코드가 실제로 메모리가 누출되었습니다. 이제 수정되었습니다. CreateBitmapSourceFromHBitmap은 여전히 ​​주기적으로 실패합니다. Try/Catch 블록을 구현하여 제안한대로 정상적으로 실패합니다. 도와 주셔서 감사합니다. – PeterM

+0

@PeterM CreateBitmap 작업 만 다시 시도하면 성공합니까? 아니면 전체 루틴을 다시 실행해야합니까? –

관련 문제