Сохранение изображения из графического окна, изображение было нарисовано графическим объектом

У меня есть этот код, выдающий исключение для "pictureBox2.Image.Save(st + "patch1.jpg");" Я думаю, что на pictureBox2.Image ничего не сохранено, но я создал на нем графику. как сохранить изображение 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");

person Aamir Ali    schedule 03.10.2013    source источник


Ответы (3)


Пара проблем.

Во-первых, CreateGraphics — это временная поверхность для рисования, не подходящая для сохранения чего-либо. Я подозреваю, что вы действительно хотите создать новое изображение и отобразить его во втором 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+.

person LarsTech    schedule 03.10.2013
comment
Я мог бы быть через 3 года после OP, но спасибо за ответ, на поиск которого у меня ушло несколько часов. - person James; 23.06.2016

Graphics g = pictureBox2.CreateGraphics();

Вы должны прочитать документацию по этому методу, который вы вызываете, это совсем не то, что вам нужно. Это для рисования в элементе управления вне OnPaint, что является плохой практикой и будет перезаписано следующим OnPaint, И это не имеет ничего общего со свойством PictureBox.Image, абсолютно ничего.

Что вы на самом деле пытаетесь сделать? Вы хотите сохранить фрагмент изображения, отображаемого в элементе управления PictureBox? Вам нужен предварительный просмотр операции обрезки, прежде чем сохранить ее на диск? Нужно ли обновлять этот предварительный просмотр при изменении прямоугольника обрезки? Сообщите некоторые подробности.

person Trevor Elliott    schedule 03.10.2013

Сделайте это наоборот. Создайте целевое растровое изображение и экземпляр Graphics для этого растрового изображения. Затем скопируйте исходное изображение PictureBox в это растровое изображение. Наконец, назначьте это растровое изображение второму окну изображения.

Rectangle rectCropArea = new Rectangle(0, 0, 100, 100);
Bitmap destBitmap = new Bitmap(pictureBox2.Width, pictureBox2.Height);
Graphics g = Graphics.FromImage(destBitmap);
g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel);
g.Dispose();
pictureBox2.Image = destBitmap;
pictureBox2.Image.Save(@"c:\temp\patch1.jpg");
person Weyland Yutani    schedule 03.10.2013