2017-07-08 12 views
1

C#およびVisual StudioのWindowsフォームでは、画像を画像ボックス(pictureBox2)に読み込んだ後、画像を切り取り、別の画像ボックス(pictureBox3)に表示しています。PictureBoxで作成したグラフィックを保存するには?

今、pictureBox3の中にあるものを画像ファイルとして保存します。

どうすればいいですか?

private void crop_bttn_Click(object sender, EventArgs e) 
{ 
    Image crop = GetCopyImage("grayScale.jpg"); 
    pictureBox2.Image = crop; 

    Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
            pictureBox2.Width, pictureBox2.Height); 
    Graphics g = pictureBox3.CreateGraphics(); 

    g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
       pictureBox3.Width, pictureBox3.Height), rectCropArea, GraphicsUnit.Pixel); 
    sourceBitmap.Dispose(); 
} 
+0

あなたが試してみました:https://msdn.microsoft.com/en-us/library/をsystem.drawing.bitmap.save(v = vs.110).aspx? – Stefan

+0

_'Graphics g = pictureBox3.CreateGraphics(); '_この(無効な)Graphicsオブジェクトで作成されたものは保存できません。 e.Graphicsオブジェクトtを使用している場合でも、ペイントでのみ描画するようにコードを変更してください。 - または(おそらく良いでしょう)ビットマップに描画します。前者はpbox.DrawToBitMapで保存することができ、次に(両方のために)bitmap.Saveで保存することができます。後者の場合、 'Graphics g = Graphics.FromImage(bmp)' – TaW

+0

@TaW - あなたが言ったことはあまり得意ではありませんでした。少し説明したり、コードを見せてください。私は本当にこの問題を解決したい、私のプロジェクト全体がここでスタックされています。 –

答えて

1

control.CreateGraphicsを使用してください! どちらかここ

が新しいビットマップに描画し、それがあなたのコントロールなどを利用したトリミングコード..ですe.Graphicsパラメータを使用して、コントロールのPaintイベントでGraphics g = Graphics.FromImage(bmp)またはを使用してBitmap bmpに描画しかし、いくつかのことを変更します。

  • それはそれがめざし確認するためにusing条項を活用し、新たなBitmap
  • から作成されたGraphicsオブジェクトを使用していますそれはとてもそれがどの国境は含まれませんpictureBox3.ClientSizeの大きさを取る
  • ...

private void crop_bttn_Click(object sender, EventArgs e) 
{ 
    Image crop = GetCopyImage("grayScale.jpg"); 
    pictureBox2.Image = crop; 
    Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
            pictureBox3.ClientSize.Height); 
    using (Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
       pictureBox2.ClientSize.Width, pictureBox2.ClientSize.Height)) 
    { 
     using (Graphics g = Graphics.FromImage(targetBitmap)) 
     { 
      g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
         pictureBox3.ClientSize.Width, pictureBox3.ClientSize.Height), 
         rectCropArea, GraphicsUnit.Pixel); 
     } 
    } 
    if (pictureBox3.Image != null) pictureBox3.Image.Dispose(); 
    pictureBox3.Image = targetBitmap; 
    targetBitmap.Save(somename, someFormat); 
} 

が漏れない選択肢はになります..:

  • Paintイベントへのすべてのコード
  • Graphics g = pictureBox3.CreateGraphics();Graphics g = e.Graphics;
  • クリックイベントに次の2行を挿入すること置き換える:

Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
           pictureBox3.ClientSize.Height); 
pictureBox3.DrawToBitmap(targetBitmap, pictureBox3.ClientRectangle); 
+0

ありがとうございました。私は第一の方法に従って、私の問題を解決しました。 –

1

あなたは何をしているか知っている限り、それはいくつかのそれほど明白ではない問題を引き起こす可能性がありますので、使用しないでくださいPictureBox.CreateGraphics()方法。たとえば、あなたのシナリオでは、ウィンドウを最小化またはサイズ変更すると、pictureBox3のイメージが表示されなくなります。

var croppedImage = new Bitmap(pictureBox3.Width, pictureBox3.Height); 
var g = Graphics.FromImage(croppedImage); 
g.DrawImage(crop, new Point(0, 0), rectCropArea, GraphicsUnit.Pixel); 
g.Dispose(); 
//Now you can save the bitmap 
croppedImage.Save(...); 
pictureBox3.Image = croppedImage; 

をところで、特にpictureBox1..3のために、より合理的な変数名を使用してください:

良い方法はあなたにも保存することができ、ビットマップに描画することです。

関連する問題