nickson.b.k 0 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба Доброго времени! Осваиваю C#. Поставил себе задачу, научиться рисовать в элементе pictureBox и сохранять результат в виде файла (картинки). Рисование освоил. А вот сохранение не получается, выпадает ошибка. Суть кода: По нажатию на единственную кнопку нарисовать градиент и предложить место для сохранения файла. Вот обработчик кнопки: [CSHARP] private void button1_Click(object sender, EventArgs e) { // настройка pictureBox1 на рисование Graphics g = pictureBox1.CreateGraphics(); // Pen pen = new Pen(Color.Black); // настройка цвета линии для дальнейшего рисования for (int counter = 0; counter <= 255; counter++) { Pen pen = new Pen(Color.FromArgb(counter, (255-counter), counter, counter)); g.DrawLine(pen, counter, 0, counter, 320); // рисование } // СОХРАНЕНИЕ //Открытие диалогового окна SaveFileDialog sfd = new SaveFileDialog(); sfd.Title = "Сохранить как..."; sfd.OverwritePrompt = true; sfd.CheckPathExists = true; sfd.Filter = "Image Files(*.BMP)|*.BMP|Image Files(*.JPG)|*.JPG|Image Files(*.BMP)|*.BMP|All files(*.*)|*.*"; sfd.ShowHelp = true; if (sfd.ShowDialog() == DialogResult.OK) // нажатие кнопки ОК { try { //pictureBox1.Image = new Bitmap(pictureBox1.Image); //Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); //pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle); //bmp.Save("D:\\test1.bmp"); pictureBox1.Image.Save(sfd.FileName); } catch { MessageBox.Show("Невозможно сохранить изображение", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } [/CSHARP] А вот скрин с ошибкой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 19 января, 2022 Опубликовано 19 января, 2022 · Жалоба Вам сначала нужно создать объект файла изображения. Если нужно в растровый файл сохранить: Graphics mg; // объект типа Graphics Bitmap bmpfile = new Bitmap(this.Size.Width, this.Size.Height); // объект типа Bitmap bmpfile.SetResolution(dpi, dpi); // опционально задать разрешение тчк/дюйм mg = Graphics.FromImage(bmpfile); pictureBox1.Redraw(mg); // перерисует всё в экземпляре указанного объекта Graphics // сохр. файл bmpfile.Save(filename, ImageFormat.Png); // filename - путь к файлу // вызываем явно деструкторы, можно обернуть все в using, чтб красивее было mg.Dispose(); bmpfile.Dispose(); если нужно в векторный (EMF): Graphics g, mg; g = this.CreateGraphics(); IntPtr hdc = g.GetHdc(); // получение контекста Metafile mfile = new Metafile(filename, hdc); // объект для сохранения в EMF/WMF mg = Graphics.FromImage(mfile); pictureBox1.Redraw(mg); // перерисовываем в mg // убираем всё в правильной последовательности mg.Dispose(); mfile.Dispose(); g.ReleaseHdc(); g.Dispose(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nickson.b.k 0 22 января, 2022 Опубликовано 22 января, 2022 · Жалоба 19.01.2022 в 16:32, alexunder сказал: Вам сначала нужно создать объект файла изображения. Если нужно в растровый файл сохранить: Graphics mg; // объект типа Graphics Bitmap bmpfile = new Bitmap(this.Size.Width, this.Size.Height); // объект типа Bitmap bmpfile.SetResolution(dpi, dpi); // опционально задать разрешение тчк/дюйм mg = Graphics.FromImage(bmpfile); pictureBox1.Redraw(mg); // перерисует всё в экземпляре указанного объекта Graphics // сохр. файл bmpfile.Save(filename, ImageFormat.Png); // filename - путь к файлу // вызываем явно деструкторы, можно обернуть все в using, чтб красивее было mg.Dispose(); bmpfile.Dispose(); если нужно в векторный (EMF): Graphics g, mg; g = this.CreateGraphics(); IntPtr hdc = g.GetHdc(); // получение контекста Metafile mfile = new Metafile(filename, hdc); // объект для сохранения в EMF/WMF mg = Graphics.FromImage(mfile); pictureBox1.Redraw(mg); // перерисовываем в mg // убираем всё в правильной последовательности mg.Dispose(); mfile.Dispose(); g.ReleaseHdc(); g.Dispose(); pictureBox1.Redraw(mg); А что это за метод Redraw ? У меня пишет, что pictureBox не содержит метод Redraw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 22 января, 2022 Опубликовано 22 января, 2022 · Жалоба 1 hour ago, nickson.b.k said: pictureBox не содержит метод Redraw Совершенно так. В этом методе вам и следует делать рисование на переданном объекте типа Graphics (mg). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться