C#将位图加载到PictureBox中-缓慢并阻止用户界面。。还有别的选择吗?

C#将位图加载到PictureBox中-缓慢并阻止用户界面。。还有别的选择吗?,c#,.net,image,gdi+,picturebox,C#,.net,Image,Gdi+,Picturebox,我正在将640x480位图一个接一个地加载到图片框中。当我这样做的时候,我的UI就会被阻塞。例如,如果我在一个文本框中键入的内容与我的图片框的格式相同,我将无法看到立即按下的键,因为位图加载使UI非常慢。。 你怎么处理?有什么办法吗? 任何示例代码都很好 感谢使用后台工作程序,这样gui就不会冻结(异步调用图像显示)。 您的第二个请求有点棘手,我想简短的回答应该是不要依赖gdi+,如果这是您正在做的,因为众所周知它是缓慢的。如何准确地将图像加载到imagebox中?APicturebox实际上

我正在将640x480位图一个接一个地加载到图片框中。当我这样做的时候,我的UI就会被阻塞。例如,如果我在一个文本框中键入的内容与我的图片框的格式相同,我将无法看到立即按下的键,因为位图加载使UI非常慢。。 你怎么处理?有什么办法吗? 任何示例代码都很好


感谢使用后台工作程序,这样gui就不会冻结(异步调用图像显示)。


您的第二个请求有点棘手,我想简短的回答应该是不要依赖gdi+,如果这是您正在做的,因为众所周知它是缓慢的。如何准确地将图像加载到imagebox中?

A
Picturebox
实际上是一个相当“沉重”的控件,它提供的是什么;在这里使用它可能不合适。您可能会考虑更简单的容器控件,或者在窗体本身的表面上绘制。

如果您想考虑“代码>后台工作人员<代码>或任何其他线程技术,请记住,绘图本身必须发生在UI线程上;这是没有办法的

如果从磁盘加载图像是延迟的来源,您可以考虑将图像加载到另一个线程的内存内位图,然后以某种方式发送信号以指示新项目已准备好被绘制。然后,将使图形表面无效,并根据需要添加新项

还有,;如果要对图像进行任何缩放,则在背景线程中执行此操作是合适的-这样,绘图代码本身只需要绘制一个未缩放的矩形;使用GDI+DrawUnscaled功能将位图复制到完全相同大小的区域实际上相当快



要深入了解任何更具体的内容,比如实际的代码,我想看看您现在是如何操作的代码。我甚至不确定你是在“绘制”图像,而不是简单地设置
图片
/
图像
属性。

是的,这就是我读到的关于GDI+的内容。。。我只是通过将位图分配给PictureBox:picBox.image=myBitmap来加载图像;将位图绘制到面板这样的表面会更快吗?请记住,您不应该在UI线程之外的任何其他线程中绘制或设置
图片
属性。谢谢,让我告诉您我正在工作的上下文,我正在使用视频会议应用程序,基本上位图是编码的,从一个端点传输、解码和显示到另一个端点。将字节数组(包含编码数据)解码成位图后,我将其显示在PictureBox中:myPictureBox.Image=myBitmap;如果我将分配图像到PictureBox的部分注释掉,我根本没有遇到UI缓慢的问题,因此我假设瓶颈就在这里;首先要检查的是确保您的PB设置没有导致图像以任何方式缩放。下一个要考虑的事情可能完全违背你所听到的:使用GDI+来“直接”将图像“缩放”到你的表面。这意味着要做一大堆额外的事情,包括在控件无效时(例如由于覆盖它的另一个表单)根据需要重新绘制图像。我怀疑GDI+有些“慢”的感觉来自于人们没有正确地实现它(尽管它比更原始的绘图方法慢一点)