2011-09-12 3 views
2

이 메서드는 스크린 샷을 찍은 다음 이미지를 호출하는 메서드로 반환해야합니다.어떻게 비트 맵 형식을 반환합니까?

Bitmap bitmap = MyClass.TakeScreenshot(0, 0, 200, 200); 
bitmap.Save(@"C:\test.jpg", ImageFormat.Jpeg); 

그럼 난 저장-방법에서 오류가 발생합니다 :

public static Bitmap TakeScreenshot(int x, int y, int height, int width) 
{ 
    Rectangle bounds = new Rectangle(0, 0, height, width); 
    Bitmap bitmap; 

    using (bitmap = new Bitmap(bounds.Width, bounds.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.CopyFromScreen(new Point(x, y), Point.Empty, bounds.Size); 
     } 
    } 

    return bitmap; 
} 

문제는 내가 사진을 저장하려고하면 때문이다.

ArgumentException 처리되지 않았습니다. 매개 변수가 유효하지 않습니다.

이 같은 방법 내부에 저장하려고하면 그것은 잘 작동 : 내가 여기서 뭘

public static Bitmap TakeScreenshot(int x, int y, int height, int width) 
{ 
    Rectangle bounds = new Rectangle(0, 0, height, width); 

    using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      g.CopyFromScreen(new Point(x, y), Point.Empty, bounds.Size); 
     } 
     bitmap.Save(@"c:\begin.tiff", ImageFormat.Tiff); 
    } 
} 

를 놓친 거지?

+0

두 번째 방법으로 JPEG로 저장하려고 했습니까? 지금 당장 통과하고 실패하는 코드는 두 가지 형식으로 저장하려고합니다. –

+0

혼란을 피하기 위해 나는 이것을 알고 있었을 것입니다. 그러나 장래에 같은 형식으로 저장됩니다. –

답변

6

첫 번째 예에서는 Bitmapusing 문을 통해 처리되었으므로 나중에 저장하게됩니다.

두 번째 예에서는 처분하기 전에 저장합니다.

using 문에 비트 맵을 래핑하지 말고 대신 가비지 수집기로 남겨 두거나 저장 한 후에 .Dispose()으로 호출하면됩니다.

개인적으로 IDisposable 인터페이스를 구현하는 항목의 경우, 내 사용법에 따라이를 유지하도록 지시하지 않는 한 Dispose이 호출되는 경향이 있습니다.

+0

감사합니다. 나는 IDisposable 인터페이스를 구현할 때 그것에 대해 생각하려고 노력할 것이다. –

1

당신이 선언하고 사용하여 블록 외부에서 비트 맵 개체에 액세스하는 경우, 다음 사용하여 블록을 사용하지 않는이 : 나는 이런 식으로 코딩 한 것이다 :

public static Bitmap TakeScreenshot(int x, int y, int height, int width) 
{ 
    Rectangle bounds = new Rectangle(0, 0, height, width); 
    Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height)) 
    Graphics g = Graphics.FromImage(bitmap); 
    g.CopyFromScreen(new Point(x, y), Point.Empty, bounds.Size); 

    return bitmap; 
} 
+0

우수합니다. 나는 일반적으로 :-)를 사용하지 않고있다. –

+1

당신은 문장에서 사용하는 것을 사용하는 사람을 볼 때 프로그래머라는 것을 알며 그 의미를 알 수있다. – djdanlib

3

Bitmap 전에 배치되는 당신이 방법의 범위를 외부에서 비트 맵을 사용하려면

using (bitmap = new Bitmap(bounds.Width, bounds.Height)) 
{ 
} 
//using block makes sure Dispose is called when 
//out of scope so this bitmap is no more 
return bitmap; 

, 당신은해야합니다 : - 반환에 즉, 당신이 Dispose 호출했다 이미 않은 IDisposable 객체를 반환하고 말을하는 것입니다 "소유권 해제" (생성하지만 해당 범위 내에서 파기에 대한 책임을지지 않습니다.) 호출자가이를 관리하고 적절하게 처리 할 수있게합니다.