【问题标题】:Display picture box faster更快地显示图片框
【发布时间】:2011-04-03 19:29:14
【问题描述】:

我正在尝试将图像快速加载到图片框中并在其上绘图。在将位图分配给图片框的时间和它出现的时间之间,我有 0.13 秒的延迟。并且每当我执行picturebox.refresh() 时,在调用paint 方法之前的延迟都是0.13 - 0.15 秒。有什么办法可以摆脱这种延迟?

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

这是我的 pictureBox_MouseMove 事件中的代码:

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

然后当我的绘画事件被调用时,我会画出一条线。延迟在两条跟踪线之间。

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

如果我使用 1125kb 的灰度 jpg 图像,则延迟为 0.14 秒。将此图像加载到内存中需要 0.26 秒。用这个位图替换我的图片框位图需要 0.03 秒。

【问题讨论】:

    标签: c# image graphics picturebox


    【解决方案1】:

    假设您的代码中没有其他延迟会阻止 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.Image.Dispose();
                pictureBox1.Image = dest;
            }
        }
    

    您可能需要对此进行修改,以使图像保持其纵横比。首先按原样尝试以确保您确实获得了性能改进。

    【讨论】:

    • 汉斯,这可以做到!初步测试肯定更好!在此处将其放入我的代码中并正确设置纵横比 ...
    • 汉斯,太完美了!很不错!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多