web-dev-qa-db-ja.com

編集後に画像ボックスコントロールをjpegファイルとして保存する方法

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

しかし、保存されたファイルには、私が描いた長方形が含まれることはありません。

誰か考えがありますか?

10
tguclu

おそらく、PictureBoxに直接描画するべきではありません。

代わりにビットマップを使用する必要があります。ビットマップをPictureBox.Imageに配置してから、Save()を呼び出してみてください。

詳細については this を確認してください

5
tzup

ありがとう。あなたの答えはすべて助けになりました。これはうまくいった

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

これが、さまざまなファイルタイプへの追加サポートを備えた私のソリューションです。

    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);
        }
    }
3
0lukasz0

これは私にとっていくつかのことを明らかにした小さな例です(私もこれに少し苦労していました)。

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");
    }
3
shooky

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_ );
1
TcKs