我的相框有时在完成图像创建时或在中途完成时清除所有图形。在绘图开始之前调用GC.Collect()可以在清除之前绘制更多,但是我怎样才能阻止它完全清除?如果使用vb.net中的代码绘制图像,强制使用PictureBox保留其图像
这是在vb.net
谢谢!
我的相框有时在完成图像创建时或在中途完成时清除所有图形。在绘图开始之前调用GC.Collect()可以在清除之前绘制更多,但是我怎样才能阻止它完全清除?如果使用vb.net中的代码绘制图像,强制使用PictureBox保留其图像
这是在vb.net
谢谢!
一个简单的方法在净坚持绘制的图像是做绘图到单独的位图对象,然后将图片框的图像属性等于设置为位图,这样的:
Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (Graphics g = Graphics.FromImage(bmp))
{
// draw whatever
}
pictureBox1.Image = bmp;
对不起这是C#,但它应该说明原则确定。
持久化绘制图像的另一种方法是在PictureBox的Paint事件中执行绘制,但这意味着每次控件需要重绘本身时都会执行绘图代码(每当另一个表单被拖拽到其顶部时)等等。)。上面的方法(设置控件的Image属性)更简单。
在上述情况下,当“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()
明白!比特慢,但如果我最小化窗口,它的方式会更快。考虑到它必须绘制30000像素INDIVIDUALLY,3秒没有坏。 – Cyclone 2009-10-07 02:56:07
如果你正在逐个像素绘制,一个更快但更复杂的技术是调用位图上的LockBits方法。请参阅http://www.vb-helper.com/howto_net_lockbits_image_class.html或http://www.bobpowell.net/lockingbits.htm – MusiGenesis 2009-10-07 03:02:27
我正在使用SetPixel,这很慢,你可以想象,特别是因为我添加了一些application.doevents()它大声笑 – Cyclone 2009-10-07 03:13:04