gpt4 book ai didi

c# - 图像加载和流/文件依赖

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:46 26 4
gpt4 key购买 nike

现在我有一个应用程序可以将一堆缩略图图像加载到 PictureBox 控件中。有时一次超过一百个。图像是使用 Image.FromStream(MemoryStream) 创建的,内存流表示每个 JPG 文件。

目前,只要调用 Image.FromStream,我就会将引用分配给图片框,然后在 Flush() 和 Dispose() 之后立即分配流。

根据文档,在处理完图像之前,我不应该发布流。但是,我这样做没有任何错误。 My PictureBox 控件可以整天使用缩略图重绘自身,即使在内存流早已被处理后也是如此。

但是,如果我尝试以任何方式访问这些图像,例如调用 Save 函数,则会抛出错误。

  • 如果 Bitmap 依赖于内存流或文件流,它会在您销毁它时销毁源吗?还是仅当它使用 Bitmap.FromFile 创建流本身时?

  • 像我这样立即处理 MemoryStream 是否可以? PictureBox 必须以某种方式缓存图像。我从来没有遇到过错误,因为一旦设置好图像,我就不需要触摸它。

我还注意到我的 PictureBox 需要很长时间才能在其父控件上绘制。我不确定这是因为我有太多控件,还是因为第一次在 PictureBox 中绘制图像时存在延迟。

我知道当您使用文件参数创建一个新的位图时,它实际上不会加载文件内容,直到第一次需要它时。我的问题是,我不希望每个 OnPaint 操作都因文件读取而延迟,我想确保在尝试绘制控件之前预加载数据,否则我会出现闪烁和缓慢的绘制。

是否有强制预加载图像的好方法? Image.FromFile、Image.FromStream、new Bitmap(fileName) 等之间的差异是什么?这些中的任何一个是立即加载所有字节,还是延迟到第一次需要它们时才加载?

这是我的代码:

MemoryStream ms = new MemoryStream(bytes); // byte[] array
pictureBox.Image = Image.FromStream(ms);
ms.Flush();
ms.Dispose();

最佳答案

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

从 Image 派生的一切都在幕后使用 Stream。它们的加载行为是相同的。

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

此外,只有在 Stream 已被写入时,对 Stream 调用 Flush 才有效。

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

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

关于c# - 图像加载和流/文件依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9133399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com