Взять битмап пикчербокса

У меня есть условный рисунок внутри пикчербокс1, надо его вынести в пикчербокс2. В русскоязычном интернете не нашел.

Graphics g = pictureBox1.CreateGraphics();
Graphics gg = pictureBox2.CreateGraphics();
g.FillRectangle(new SolidBrush(Color.Red), 0, 0, 10, 10);
gg = g;

Я не нашел как это сделать, есть только одно обсуждение в русскоязычном интернете: https://coderoad.ru/1063505/%D0%9A%D0%B0%D0%BA-%D1%81%D0%BE%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C-%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82-%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-picturebox-%D0%B2-%D0%B2%D0%B8%D0%B4%D0%B5-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0-jpeg-%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%B5%D0%B3%D0%BE . Но они так и не нашли ответ.... Единственное решение это рисовать сразу в битмап, а потом присваивать его.


Ответы (2 шт):

Автор решения: Alexander Petrov

В заголовке у вас написано "битмап". Bitmap - это растровое изображение.
В коде у вас векторные команды рисования на Graphics.

Так что именно вам нужно?


Если нужен битмап, создавайте объект типа Bitmap и рисуйте на его графиксе. Потом это растровое изображение можно присваивать свойству (Background)Image любого контрола. Можно и в файл сохранять.


Кроме того, если просто рисовать на графиксе, созданном у контрола вызовом метода CreateGraphics(), то рисунок будет исчезать, например, после сворачивания-разворачивания формы. Чтобы рисунок оставался, нужно рисовать в событии Paint.


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

private void Draw(Graphics graphics)
{
    using (var brush = new SolidBrush(Color.Red))
    {
        graphics.FillRectangle(brush, 0, 0, 10, 10);
    }
}

Обратите внимание на использование using - кисть является ресурсом, который нужно освобождать. Это важно!

Теперь этот метод можно использовать для рисования на любых контролах:

Draw(pictureBox1.CreateGraphics());
Draw(pictureBox2.CreateGraphics());

Как уже было сказано, рисовать нужно в событии Paint. Используем этот метод в нём:

private void PictureBox_Paint(object sender, PaintEventArgs e)
{
    Draw(e.Graphics);
}

На это событие можно подписать любой пикчабокс (и вообще контрол).

→ Ссылка
Автор решения: Pavlo Khyzhniak

Попробуйте через Bitmap:

Bitmap img_bitmap = new Bitmap(PaintPictureBox.Image); PaintPictureBox.Image = img_bitmap;

→ Ссылка