现在我有一个应用程序,将一堆缩略图加载到PictureBox控件中。有时超过一百次。这些图像是使用Image.FromStream(MemoryStream)创建的,而内存流代表每个JPG文件。图像加载和流/文件依赖
目前,只要我调用Image.FromStream,我将引用分配给图片框,然后在I Flush()和Dispose()之后立即分配流。
根据文档,我不应该释放流,直到我完成了图像。但是,我没有这样做过任何错误。我的PictureBox控件甚至可以在内存流很长时间处理后,使用缩略图图像整天重新绘制自己。
但是,如果我尝试以任何方式访问这些图像,例如调用Save函数,则会引发错误。
如果一个位图对内存流或文件流的依赖,这将部署在处置它的来源?或者仅当它使用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();
你从我的测试看我的结果吗?我处理了用于Image.FromStream的流,但我的PictureBox控件仍然很好地绘制。我只是想弄清楚为什么会发生这种情况,以便更好地理解如何从PictureBoxes获得最佳性能。 – 2012-02-03 19:20:26
@Moozhe,我想,MemoryStream Dispose()实际上并没有**配置内存,因为MemoryStream实现:它使用简单的字节数组(它将被垃圾收集)。你可以试试FileStream类的实验吗? – 2012-02-03 19:25:17
这听起来是正确的,因为MemoryStream没有分配内存...... PictureBox必须持有对byte []数组内存地址的引用,这就是为什么它没有被垃圾收集。 – 2012-02-03 19:36:39