2011-09-12 19 views
2

このメソッドは、スクリーンショットを取得して呼び出しメソッドにイメージを返すことになっています。ビットマップタイプを返すにはどうすればよいですか?

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; 
} 

問題は、私は絵を保存しようとすることです:

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

その後、私はセーブ・メソッドでエラーが発生します。

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

2番目の方法でJpegとして保存しようとしましたか?現在、合格していないコードは2つの異なるフォーマットで保存しようとしています。 –

+0

私は混乱を避けるためにそれを修正しているはずです。しかし、将来同じフォーマットで保存されます。 –

答えて

6

最初の例では、Bitmapusingステートメントで処理されていますが、その後保存しています。

2番目の例では、廃棄する前に保存しています。

usingステートメントでビットマップをラップするのではなく、ガベージコレクタ用にビットマップを残しておくか、または保存後に.Dispose()に電話するかのいずれかを実行してください。

個人的には、IDisposableインターフェイスを実装するアイテムについては、私の使用法ではそれが生き続けるよう指示されない限り、Disposeが呼び出されることがあります。

+0

ありがとうございます。私はIDisposableインターフェイスを実装するときにそれについて考えようとします。 –

1

あなたが使用してブロックの外側Bitmapオブジェクトを宣言し、アクセスしている場合は、使用してブロックを使用していない:)私はこのようにそれをコード化されています:

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の前に配置されています返却されることに - それはあなたがすでにDisposeを呼んでいたしましたIDisposableオブジェクトを返すしている、と言うことです:あなたは法の範囲外のビットマップを使用する場合は、あなたがする必要があります

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; 

を「所有権を解放する」 (それを作成しますが、その範囲内での破壊に責任を負いません)、呼び出し元に管理させ、それに応じて処分することができます。

関連する問題