图像加载和流/文件依赖性

时间:2012-02-03 18:11:51

标签: c# .net winforms image bitmap

现在我有一个应用程序将一堆缩略图加载到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();

2 个答案:

答案 0 :(得分:1)

作为Image类基础的GDI +要求源流保持打开,而Image存在才能正常工作。在Image使用它时,将更改写入源流也是一个坏主意。更改应保存到其他流中。

从Image派生的所有内容都使用了一个Stream。他们的装载行为是一样的。

图像不会关闭或处理通过FromStream提供给它的流。你必须自己管理。

另外,如果Stream已写入,则仅在Stream上调用Flush会有效。

如果您希望改善PictureBox的UI行为,请尝试以下操作:

  1. 将InitialImage设置为小型微调器GIF。
  2. 将WaitOnLoad设置为false。
  3. 通过设置ImageLocation指定图像。 (您可以在其中使用filespec或URL。)
  4. 使用LoadAsync方法异步加载图像。

答案 1 :(得分:0)

1)

  

如果Bitmap依赖于内存流或文件流,则会   处理它时它会处理掉它吗?或者这只是在什么时候   它使用Bitmap.FromFile?

创建流本身

看看Image.FromStream Method (Stream, Boolean)

  

您必须在图像的生命周期内保持流打开。

2)

  

PictureBox必须以某种方式缓存图像。我从来没有过   错误,因为一旦设置完毕,我就不需要触摸图像了。

你应该不处理Image实例,因为它已经被分配到PictureBox (即图片框正在使用它),而当PictureBox使用它时。否则,PictureBox将尝试使用处理后的图像,这会导致一些“不好”的后果。

PictureBox.Image Property

  

注意如果要在多个PictureBox中使用相同的图像   控件,为每个PictureBox创建图像的克隆。访问   来自多个控件的相同图像会导致异常发生。

<强>更新

示例与实际情况相同:HOW TO: Copy a Picture from a Database Directly to a PictureBox Control with Visual C#