Заставить PictureBox сохранить свое изображение, если изображение было нарисовано с использованием кода в vb.net - PullRequest
3 голосов
/ 07 октября 2009

Мои ящики с картинками иногда очищают все рисунки, когда они закончили создавать изображение, или иногда на полпути. Вызов GC.Collect () до начала рисования позволяет рисовать БОЛЬШЕ, прежде чем очистить, но как я могу остановить его полное удаление?

Это в vb.net

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Простой способ сохранить нарисованные изображения в .Net - сделать рисование на отдельном растровом объекте, а затем установить свойство ImageBox равным растровому изображению, например:

Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
    // draw whatever
}
pictureBox1.Image = bmp;

Извините, это C #, но он должен проиллюстрировать принцип OK.

Другой способ сохранить нарисованные изображения - это рисовать в событии Paint в PictureBox, но это означает, что ваш код рисования будет выполняться каждый раз, когда элемент управления должен перерисовать себя (что происходит, когда поверх него перетаскивается другая форма и т. Д.) .). Вышеуказанный метод (установка свойства Image элемента управления) проще сделать.

0 голосов
/ 15 апреля 2010

В приведенном выше случае, когда объект «bmp» или «g» выходит за пределы области видимости и собирается мусор, изображение в картинке изменяется. Я думаю, что изображение всегда скопировано. Я попытался bmp.clone, чтобы скопировать изображение в Picturebox, но все же, когда bmp собирает мусор, изображение Picturebox исчезает. В моем случае у меня есть несколько (определенных во время выполнения) таких изображений, которые нужно назначить для созданных во время выполнения картинных ящиков.

Dim bm As New Bitmap("C:\picture.bmp")
Dim thumb As New Bitmap(42, 30)
Dim g As Graphics = Graphics.FromImage(thumb)

g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.DrawImage(bm, New Rectangle(0, 0, 42, 30), New Rectangle(0, 0, bm.Width, _bm.Height), GraphicsUnit.Pixel)
pbxHead.Image = thumb.Clone()

g.Dispose()
bm.Dispose()
thumb.Dispose()
...