Сохранение всех нарисованных объектов в растровое изображение - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть Canvass (PictureBox), и на него можно нарисовать Shapes, Images или Text, как показано на рисунке ниже.Теперь я хочу сохранить их все в один файл BITMAP .Понятия не имею, как мне начать?

enter image description here

PS: я использую разные объекты Graphics для рисования каждого.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Graphics является "контекстом устройства" объектом.Он обрабатывает рисунки в Bitmap, но не может быть преобразован обратно в Bitmap.

Однако вы можете скопировать биты, уже нарисованные на вашем окне, и нарисовать на Graphics.Например:

protected override void OnMouseClick(MouseEventArgs e)
{
    base.OnMouseClick(e);

    //get the screen coordinates for this window
    var rect = this.RectangleToScreen(this.ClientRectangle);

    //copy bits from screen to bitmap
    using (var bmp = new Bitmap(rect.Width, rect.Height))
    {
        var gr = Graphics.FromImage(bmp);
        gr.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);

        //save to file
        bmp.Save(@"c:\test\test.bmp");
    }
}

Или вы можете сделать это сразу после рисования в ответ на сообщения Windows, но вам нужно позвонить Graphics::Flush, чтобы сообщить Windows, когда вы закончите рисовать.Этот метод предполагает, что целевое окно является видимым.Между командами может быть задержка, или часть окна не видна, и вы не получите желаемый результат.

В другом ответе предлагается лучшее решение: создать растровое изображение памяти и нарисоватьк этому.

Если вы не хотите повторять код, вы можете создать функцию, которая обрабатывает все рисунки как для контекста устройства окна, так и для контекста устройства памяти:

public void do_all_paintings(Graphics gr)
{
    //paint something random, add all other drawings
    gr.Clear(Color.Red);
}

Теперь рисуйте в ответв запрос рисования Windows:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    do_all_paintings(e.Graphics);
}

Используйте ту же функцию do_all_paintings для создания файла в ответ на команду:

protected override void OnMouseClick(MouseEventArgs e)
{
    base.OnMouseClick(e);

    var rect = this.RectangleToScreen(this.ClientRectangle);
    using (var bmp = new Bitmap(rect.Width, rect.Height))
    {
        do_all_paintings(Graphics.FromImage(bmp));
        bmp.Save(@"c:\test\test.bmp");
    }
}
0 голосов
/ 15 ноября 2018

Найден обходной путь, это сохранит рисунки на моем рисунке Box / Canvass.

private void button2_Click(object sender, EventArgs e)
    {
        SaveFileDialog save = new SaveFileDialog();

            //Creates a filter fir saving the Project File
            save.Filter = "Image Files(*.jpg; *.jpeg; *.gif; *.bmp); *.PNG|*.jpg; *.jpeg; *.gif; *.bmp; *.PNG";     
            save.DefaultExt = ".bmp";
            save.AddExtension = true;

            if (save.ShowDialog() == DialogResult.OK)
            {
                using (var bmp = new Bitmap(pictureBox_Canvass.Width, pictureBox_Canvass.Height))
                {
                    pictureBox_Canvass.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
                    bmp.Save(save.FileName);
                }
            }
    }

ОБРАЗЕЦ ВЫХОДА

enter image description here

...