WindowsフォームアプリケーションにPictureBox
があります。
その中に画像をロードし、コードでPaint
イベントを有効にしました。長方形を描きます。
このような:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics gr = e.Graphics;
Pen p = new Pen(Color.Red);
p.Width = 5.0f;
gr.DrawRectangle(p, 1, 2, 30, 40);
}
そして、「保存」ボタンをクリックします。
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}
しかし、保存されたファイルには、私が描いた長方形が含まれることはありません。
誰か考えがありますか?
おそらく、PictureBoxに直接描画するべきではありません。
代わりにビットマップを使用する必要があります。ビットマップをPictureBox.Imageに配置してから、Save()を呼び出してみてください。
詳細については this を確認してください
ありがとう。あなたの答えはすべて助けになりました。これはうまくいった
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.ImageLocation=@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ;
}
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image);
Graphics gr = Graphics.FromImage(bmp);
Pen p = new Pen(Color.Red);
p.Width = 5.0f;
gr.DrawRectangle(p, 1, 2, 30, 40);
pictureBox1.Image = bmp;
}
これが、さまざまなファイルタイプへの追加サポートを備えた私のソリューションです。
public void ExportToBmp(string path)
{
using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
{
pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
ImageFormat imageFormat = null;
var extension = Path.GetExtension(path);
switch (extension)
{
case ".bmp":
imageFormat = ImageFormat.Bmp;
break;
case ".png":
imageFormat = ImageFormat.Png;
break;
case ".jpeg":
case ".jpg":
imageFormat = ImageFormat.Jpeg;
break;
case ".gif":
imageFormat = ImageFormat.Gif;
break;
default:
throw new NotSupportedException("File extension is not supported");
}
bitmap.Save(path, imageFormat);
}
}
これは私にとっていくつかのことを明らかにした小さな例です(私もこれに少し苦労していました)。
pBoxはForm1のPictureBoxであり、少なくとも50x50にします。
appPathはSystem.Reflectionから派生しましたが、任意のパスを使用してください
2つのボタンがあります。1つは描画用、もう1つは保存用で、クリックイベントは以下のコードにあります。
私が学んだこと:
(1) "pBox.Image ="は、pBoxイメージを初期化する以外は何もしません。使用したすべての例のように、ファイル名である必要はありません(共有ロックされているため、同じファイルに保存する際に問題が発生しました)。また、コントロールの表面全体を表示することが目標である場合は、初期化時のサイズを必要なサイズに設定することをお勧めします。この例ではpBoxのサイズを使用しましたが、通常はビットマップサイズを使用します(通常は実際の画像ファイルから始めるため)。
(2)描画がコントロールに表示されるか、変更が出力ファイルに保存されるか(またはその両方)に常に問題がありました。以前の試みでは、コントロールとビットマップの両方で描画を複製していました。もちろん、それは必要ではありませんが、編集されたビットマップをcontrol.imageに再ロードする必要があります...そしてそれは私が見逃していたこのパズルのピースでした。
(A)control.imageからビットマップを作成し、ビットマップに描画します
(B)ビットマップをcontrol.Imageにロードします(描画によって引き起こされた変更を確認できるようにします)
(C)コントロールを保存します。画像
(2オプション)グローバル(または渡された)ビットマップがあります(おそらく実際のファイルから)
(A)ビットマップに描画します
(B)ビットマップをcontrol.Imageにロードします(変更を確認できるように)
(C)ビットマップを保存します
public Form1()
{
InitializeComponent();
pBox.Image = new Bitmap(pBox.Width, pBox.Height);
}
private void DrawStuff1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pBox.Image);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter
pBox.Image = bmp; //this makes your changes visible
}
private void Save_Click(object sender, EventArgs e)
{
pBox.Image.Save(appPath + "SavedImage.bmp");
}
PaintイベントのGraphicsコントロールではなく、画像の画像にPaintが必要です。
編集:
using( Graphics g = Graphics.FromImage( pictureBox1.Image ) ) {
// there you will be do, what you do in Paint event
}
// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );