加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 更快地显示图片框

发布时间:2020-12-15 17:15:06 所属栏目:百科 来源:网络整理
导读:我正在尝试将图像快速加载到图片框中并绘制它们.我将位图分配到图片框和显示时间之间有0.13秒的延迟.每当我执行一个picturebox.refresh()时,它都会在调用paint方法之前的.13 – .15秒内延迟.有没有办法摆脱这种延迟? 我在Visual Studio 2010中使用C#.我使用
我正在尝试将图像快速加载到图片框中并绘制它们.我将位图分配到图片框和显示时间之间有0.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秒.

解决方法

假设您的代码中没有其他延迟会阻止UI线程重新进入消息循环,以便可以调用OnPaint()方法:在PictureBox绘制Image之后调用Paint事件处理程序.它尚不可见,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;
        }
    }

您可能想要修补它,以便图像保留其纵横比.首先尝试,以确保您获得性能改善.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读