2009-10-07 47 views

回答

1

一个简单的方法在净坚持绘制的图像是做绘图到单独的位图对象,然后将图片框的图像属性等于设置为位图,这样的:

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

对不起这是C#,但它应该说明原则确定。

持久化绘制图像的另一种方法是在PictureBox的Paint事件中执行绘制,但这意味着每次控件需要重绘本身时都会执行绘图代码(每当另一个表单被拖拽到其顶部时)等等。)。上面的方法(设置控件的Image属性)更简单。

+0

明白!比特慢,但如果我最小化窗口,它的方式会更快。考虑到它必须绘制30000像素INDIVIDUALLY,3秒没有坏。 – Cyclone 2009-10-07 02:56:07

+0

如果你正在逐个像素绘制,一个更快但更复杂的技术是调用位图上的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

+0

我正在使用SetPixel,这很慢,你可以想象,特别是因为我添加了一些application.doevents()它大声笑 – Cyclone 2009-10-07 03:13:04

0

在上述情况下,当“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()