2012-02-22 13 views
0

私は自分の作業環境で画像を切り取るために使用される小さなアプリケーションを作成しました。画像を含むウィンドウフォーム(.NET 3.5)には、画像のセクションをドラッグしたり、ボタンを押して長方形の背後にあるものを取得したりするために使用する透明な四角形があります。長方形の背後にある画像をキャプチャする

現在、以下のコードを使用していますが、これはキャプチャしている領域がかなりのピクセルだけ外れているためです。私はCopyFromScreen関数と関係があると思います。

//Pass in a rectangle 
    private void SnapshotImage(Rectangle rect) 
    { 
     Point ptPosition = new Point(rect.X, rect.Y); 
     Point ptRelativePosition; 

     //Get me the screen coordinates, so that I get the correct area 
     ptRelativePosition = PointToScreen(ptPosition); 

     //Create a new bitmap 
     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 

     //Sort out getting the image 
     Graphics g = Graphics.FromImage(bmp); 

     //Copy the image from screen 
     g.CopyFromScreen(this.Location.X + ptPosition.X, this.Location.Y + ptPosition.Y, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 
     //Change the image to be the selected image area 
     imageControl1.Image.ChangeImage(bmp); 
    } 

画像がかなり出て再描画されたとき、私はこの時点で永遠に感謝されるだろう、なぜ誰もが見つけることができます。また、ChangeImage関数はうまくいきます - 選択領域としてフォームを使用すると機能しますが、四角形を使用するとちょっとジャズになります。

答えて

0

は興味深いことに、これは、メインフォームと画像が上だったとコントロールとフォームの分離の上部のツールバーとの間のスペースでしたコントロールとメインフォームの上部。以下に示すようにこの問題を回避するために、私は単純に、これらのピクセルを考慮するために、撮影画面に1行を変更:

g.CopyFromScreen(relativePosition.X + 2, relativePosition.Y+48, Point.Empty.X, Point.Empty.Y, bmp.Size); 

乾杯

1

相対位置をptRelativePositionとして取得しましたが、実際には決して使用しません。矩形の位置をフォームの位置に追加します。これはフォームの境界線を考慮しません。ここで

は、いくつかの最適化を、固定ことだ:

// Pass in a rectangle 
private void SnapshotImage(Rectangle rect) 
{ 
    // Get me the screen coordinates, so that I get the correct area 
    Point relativePosition = this.PointToScreen(rect.Location); 

    // Create a new bitmap 
    Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 

    // Copy the image from screen 
    using(Graphics g = Graphics.FromImage(bmp)) { 
     g.CopyFromScreen(relativePosition, Point.Empty, bmp.Size); 
    } 

    // Change the image to be the selected image area 
    imageControl1.Image.ChangeImage(bmp); 
} 
+0

フム、そのまだ間違ったエリアをつかんで、Y座標+ 50何らかの理由で。 –

+0

ああ、コード内のPointの名前は 'relativePosition'ですが、あなたはそれをptRelativePositionとして参照しています。 –

+0

@AdLib:プロジェクトなどをアップロードできますか? (遅れて申し訳ありませんが何らかの理由でコメント通知がありませんでした。) – Ryan

関連する問題