Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Aamir AliОтветов: 3

У меня есть этот код, выдающий исключение для "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");

bitmapgraphicspicturebox

Ответы

Ответ 1 · рейтинг 2 · LarsTech

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

Во-первых, 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+.

Ответ 2 · рейтинг 1 · Trevor Elliott

Graphics g = pictureBox2.CreateGraphics();

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

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

Ответ 3 · рейтинг 1 · Weyland Yutani

Сделайте это наоборот. Создайте целевое растровое изображение и экземпляр 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");

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы