我正在尝试将图像快速加载到图片框中并在它们上绘图。我将位图分配给图片框和它显示之间有 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 秒。
假设您的代码中没有其他延迟会阻止 UI 线程重新进入消息循环,以便可以调用 OnPaint() 方法:您的 Paint 事件处理程序被调用afterPictureBox 已绘制图像。目前还不可见,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;
}
}
您可能需要对此进行修改,以便图像保留其纵横比。首先按原样尝试,以确保您确实获得性能改进。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)