现在我有一个应用程序将一堆缩略图加载到PictureBox控件中。有时一次超过一百。图像是使用Image.FromStream(MemoryStream)创建的,内存流表示每个JPG文件。
目前,只要我调用Image.FromStream,我就会将参考分配给图片框,然后在我Flush()和Dispose()之后立即分配。
根据文档,我不应该在完成图像之前释放流。但是,我这样做没有任何错误。即使在长时间处理内存流之后,我的PictureBox控件也可以使用缩略图整天重绘自己。
但是,如果我尝试以任何方式访问这些图像,例如调用Save函数,则会抛出错误。
如果Bitmap依赖于内存流或文件流,处理它时是否会丢弃源代码?或者只有当它使用Bitmap.FromFile创建流本身时才会这样?
立即处理MemoryStream就像我认为好吗? PictureBox必须以某种方式缓存图像。我从来没有遇到过错误,因为一旦设置完毕,我就不需要触摸它了。
我还注意到我的PictureBoxes需要很长时间才能在其父控件上绘制。我不确定这是因为我有太多控件,还是因为第一次在PictureBox中绘制图像时出现延迟。
我知道当您使用文件参数创建新的位图时,它实际上并不会在首次需要之前加载文件内容。我的问题是,我不希望每个OnPaint操作都被文件读取延迟,我想确保在我尝试绘制控件之前预先加载数据,否则会出现闪烁和慢速绘制。
是否有一种强制图像预加载的好方法? Image.FromFile,Image.FromStream,新Bitmap(fileName)等之间有什么不一样?这些中的任何一个是否会立即加载所有字节,还是会在第一次需要之前延迟?
这是我的代码:
MemoryStream ms = new MemoryStream(bytes); // byte[] array
pictureBox.Image = Image.FromStream(ms);
ms.Flush();
ms.Dispose();
答案 0 :(得分:1)
作为Image类基础的GDI +要求源流保持打开,而Image存在才能正常工作。在Image使用它时,将更改写入源流也是一个坏主意。更改应保存到其他流中。
从Image派生的所有内容都使用了一个Stream。他们的装载行为是一样的。
图像不会关闭或处理通过FromStream提供给它的流。你必须自己管理。
另外,如果Stream已写入,则仅在Stream上调用Flush会有效。
如果您希望改善PictureBox的UI行为,请尝试以下操作:
答案 1 :(得分:0)
1)
如果Bitmap依赖于内存流或文件流,则会 处理它时它会处理掉它吗?或者这只是在什么时候 它使用Bitmap.FromFile?
创建流本身
看看Image.FromStream Method (Stream, Boolean):
您必须在图像的生命周期内保持流打开。
2)
PictureBox必须以某种方式缓存图像。我从来没有过 错误,因为一旦设置完毕,我就不需要触摸图像了。
你应该不处理Image实例,因为它已经被分配到PictureBox (即图片框正在使用它),而当PictureBox使用它时。否则,PictureBox将尝试使用处理后的图像,这会导致一些“不好”的后果。
注意如果要在多个PictureBox中使用相同的图像 控件,为每个PictureBox创建图像的克隆。访问 来自多个控件的相同图像会导致异常发生。
<强>更新强>
示例与实际情况相同:HOW TO: Copy a Picture from a Database Directly to a PictureBox Control with Visual C#。