Сохранение изображения из графического окна, изображение было нарисовано графическим объектом
Автор вопроса: 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");
Во-первых, 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 для создания строки файла:
Этот путь должен существовать, иначе метод 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");