Вопрос по c#, .net – Как сохранить элемент управления Picturebox в виде файла JPEG после его редактирования

10

у меня естьPictureBox в моем приложении Windows Forms.

Я загружаю картинку в нее, и я включилPaint событие в моем коде. Рисует прямоугольник.

Как это:

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Graphics gr = e.Graphics;
    Pen p = new Pen(Color.Red);
    p.Width = 5.0f;
    gr.DrawRectangle(p, 1, 2, 30, 40);
}

И я нажимаю кнопку «Сохранить» кнопка:

private void button2_Click(object sender, EventArgs e)
{
    pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}

Но сохраненный файл никогда не содержит прямоугольник, который я нарисовал.

У кого-нибудь есть идеи?

Ваш Ответ

5   ответов
5

Вы, вероятно, не должны рисовать прямо в PictureBox.

Вам нужно использовать растровое изображение вместо. Попробуйте поместить растровое изображение в PictureBox.Image, а затем вызовите Save ().

Проверьтеэтот Больше подробностей

3

Вот мое решение с дополнительной поддержкой различных типов файлов:

    public void ExportToBmp(string path)
    {
        using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
        {
        pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
        ImageFormat imageFormat = null;

        var extension = Path.GetExtension(path);
        switch (extension)
        {
            case ".bmp":
                imageFormat = ImageFormat.Bmp;
                break;
            case ".png":
                imageFormat = ImageFormat.Png;
                break;
            case ".jpeg":
            case ".jpg":
                imageFormat = ImageFormat.Jpeg;
                break;
            case ".gif":
                imageFormat = ImageFormat.Gif;
                break;
            default:
                throw new NotSupportedException("File extension is not supported");
        }

        bitmap.Save(path, imageFormat);
        }
    }
3

который прояснил несколько вещей для меня (я тоже немного боролся с этим).

pBox - это PictureBox на Form1, сделайте его размером не менее 50x50

appPath был получен из System.Reflection, но используйте любой путь, который вам нравится

Есть две кнопки, одна для рисования, другая для сохранения, их события щелчков в коде ниже.

Вещи, которые я узнал:

(1) & quot; pBox.Image = & quot; ничего не делает, кроме как инициализирует изображение pBox, оно НЕ ДОЛЖНО быть именем файла, как КАЖДЫЙ пример, который я нашел использованным (не удалось сохранить тот же файл, поскольку он был заблокирован для общего ресурса). Кроме того, если ваша цель состоит в том, чтобы видеть объекты на всей поверхности элемента управления, вам, вероятно, понравится устанавливать размер во время инициализации на нужный вам размер. Я использовал размер pBox в этом примере, но обычно я использую размер растрового изображения (потому что я обычно начинаю с реального файла изображения).

(2) У меня всегда были проблемы либо с отображением моих рисунков на элементе управления, либо с сохранением изменений в выходном файле (или в обоих). В моих предыдущих попытках я дублировал рисунки как на элементе управления, так и на растровом изображении. Конечно, в этом нет необходимости, но отредактированное растровое изображение ДОЛЖНО быть перезагружено в control.image ... и это был фрагмент этой головоломки, который мне не хватало.

(A) Создайте растровое изображение из control.image и нарисуйте растровое изображение

(B) Загрузите растровое изображение в элемент управления. Изображение (чтобы вы могли видеть изменения, вызванные рисованием)

(C) Сохранить элемент управления. Изображение

(2 варианта) У вас есть глобальное (или переданное) растровое изображение (возможно, из реального файла)

(A) рисовать на растровом изображении

(B) Загрузите растровое изображение в элемент управления. Изображение (чтобы вы могли видеть изменения)

(C) Сохранить растровое изображение

    public Form1()
    {
        InitializeComponent();
        pBox.Image = new Bitmap(pBox.Width, pBox.Height);  
    }

    private void DrawStuff1_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pBox.Image);  
        Graphics g = Graphics.FromImage(bmp);

        g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter

        pBox.Image = bmp;  //this makes your changes visible
    }

    private void Save_Click(object sender, EventArgs e)
    {
        pBox.Image.Save(appPath + "SavedImage.bmp");
    }
6

Спасибо. Ваши ответы помогли. Это сработало

        private void button1_Click(object sender, EventArgs e)
    {
        [email protected]"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
    }

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        Bitmap bmp = new Bitmap(pictureBox1.Image);
        Graphics gr = Graphics.FromImage(bmp);
        Pen p = new Pen(Color.Red);
        p.Width = 5.0f;
        gr.DrawRectangle(p, 1, 2, 30, 40);
        pictureBox1.Image = bmp;
    }
Вы должны использовать & quot; используя (...) {...} & quot; шаблон. Теперь вы можете иметь некоторые утечки памяти. И если какой-то ответ решит ваш ответ, вы должны принять его;).
1

а не элемент управления Graphics в событии Paint.

EDIT:

using( Graphics g = Graphics.FromImage( pictureBox1.Image ) ) {
    // there you will be do, what you do in Paint event
}

// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );
Привет Можете ли вы уточнить / привести пример? tguclu

Похожие вопросы