更快地显示图片框

时间:2010-08-25 15:26:51

标签: c# image graphics picturebox

我正在尝试将图像快速加载到图片框中并在上面绘图。我在将位图分配到图片框和显示时间之间有.13秒的延迟。每当我执行picturebox.refresh()时,它就会在调用paint方法之前的.13 - .15秒内延迟。有没有办法摆脱这种延迟?

我在Visual Studio 2010中使用C#。我使用FreeImage库加载图像。

以下是我的pictureBox_MouseMove事件中的代码:

if (IsMouseDown || DrawLine.Checked || IsMovingBox)  
{  
  Tracing.Trace("Update Picture Box");  
  pictureBox.Refresh();  
} 

然后在调用paint事件时跟踪一行。延迟在两条迹线之间。

如果我在117kb使用双色调tiff图像,则延迟为.13秒。将此图像加载到内存中需要0.04秒。用这个位图替换我的picturebox位图需要0.01秒。

如果我在1125kb使用灰度jpg图像,则延迟为.14秒。将此图像加载到内存需要0.26秒。用这个位图替换我的picturebox位图需要0.33秒。

1 个答案:

答案 0 :(得分:12)

假设您的代码中没有其他延迟会阻止UI线程重新进入消息循环,以便可以调用OnPaint()方法:您的Paint事件处理程序在之后被调用 PictureBox绘制了图像。它尚不可见,PB使用双缓冲。

当必须调整大小以适合PB的客户区时,该图像的绘制成本很高。在您的情况下很可能是因为您的图像非常大。它使用高质量的双立方滤镜使调整后的图像看起来很好。这是非常昂贵的,虽然结果很好。

为避免此费用,请在将图像指定给Image属性之前自己调整图像大小。使它与PB的ClientSize一样大。

这将会对自己产生重大影响。接下来您可以使用32bppPArgb像素格式创建缩放位图。它的格式比任何其他格式快10倍,因为它与大多数机器上的视频适配器匹配,因此不需要像素格式转换。

一些代码:

    private void loadImage(string path) {
        using (var srce = new Bitmap(path)) {
            var dest = new Bitmap(pictureBox1.Width, pictureBox1.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
            using (var gr = Graphics.FromImage(dest)) {
                gr.DrawImage(srce, new Rectangle(Point.Empty, dest.Size));
            }
            if (pictureBox1.Image != null) pictureBox1.Dispose();
            pictureBox1.Image = dest;
        }
    }

你可能想要修补它,以便图像保持其纵横比。首先尝试,以确保您获得性能提升。