1

「pictureBox2.Image.Save(st + "patch1.jpg");」で例外をスローするこのコードがあります。pictureBox2.Image には何も保存されていないと思いますが、グラフィック g を作成しました。pictureBox2.Image の画像を保存するにはどうすればよいですか?

        Bitmap sourceBitmap = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height);
        Graphics g = pictureBox2.CreateGraphics();
        g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height),rectCropArea, GraphicsUnit.Pixel);
        sourceBitmap.Dispose();
        g.Dispose();
        path = Directory.GetCurrentDirectory();
        //MessageBox.Show(path);
        string st = path + "/Debug";
        MessageBox.Show(st);
        pictureBox2.Image.Save(st + "patch1.jpg");
4

3 に答える 3

2

いくつかの問題があります。

まず、CreateGraphics は一時的な描画面であり、保存には適していません。実際に新しい画像を作成し、それを 2 番目の PictureBox に表示する必要があると思われます。

Bitmap newBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(newBitmap)) {
  g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel);
}
pictureBox2.Image = newBitmap;

次に、Path.Combine 関数を使用してファイル文字列を作成します。

string file = Path.Combine(new string[] { Directory.GetCurrentDirectory(), "Debug", "patch1.jpg" });
newBitmap.Save(file, ImageFormat.Jpeg);

そのパスが存在する必要があります。存在しない場合、Save メソッドは GDI+ 例外をスローします。

于 2013-10-03T16:08:21.203 に答える
1

Graphics g = pictureBox2.CreateGraphics();

呼び出しているこのメソッドのドキュメントを読む必要がありますが、それはあなたが望むものではありません。これは、OnPaint の外部のコントロールにペイントするためのものです。これは悪い習慣であり、次の OnPaint によって上書きされます。また、PictureBox.Imageプロパティとはまったく関係ありません。

あなたは実際に何をしようとしていますか?PictureBox コントロールに表示されている画像のトリミングを保存しますか? ディスクに保存する前に、トリミング操作のプレビューが必要ですか? 切り抜く四角形が変更されたときに、このプレビューを更新する必要がありますか? いくつかの詳細を提供します。

于 2013-10-03T16:08:29.310 に答える