c# - Image.FromFile 非常慢。任何替代方案,优化?

标签 c# .net winforms performance image

我有一个 winforms 图像列表,其中包含 200 张图像 256x256。

我使用方法 Images.FromFile 加载图像,然后将它们添加到图像列表中。

根据 ANTS .NET 分析器,程序一半的时间花在 Images.FromFile 上。有没有更好的方法来加载图像以添加到图像列表?

另一件可以优化的事情是,加载的图像大于 256x256。那么有没有一种方法可以通过先调整它们的大小来加载它们呢?如果它们的高度大于 256 像素,我只想统一缩放它们。

有优化这个的想法吗?

编辑:它们是 JPEG。

最佳答案

您没有说图像实际比 256x256 大多少 - 现代数码相机图像比这大。

磁盘 I/O 可能非常慢,我建议您首先大致了解您实际读取了多少兆字节的数据。

然后您可以确定是否存在细微的“Image.FromFile”问题或简单的“这就是我的计算机/驱动器/防病毒扫描程序/网络实际上有多慢”的问题。

基本文件 I/O 性能的简单测试将对每个图像而不是 Image.FromFile() 执行 File.ReadAllBytes() - 这将告诉您花在磁盘上的时间比例以及什么使用图像处理 - 我怀疑您会发现它主要是磁盘,此时您唯一加速它的机会可能是从文件中获取 JFIF 缩略图的技术之一。或者,也许人们可以通过部分读取渐进式 JPEG 来想象聪明的东西,尽管我不知道是否有人这样做,也不知道您的文件是否是渐进式的(他们可能不是)。

我真的不知道你需要多快的速度来加载这些文件,但如果问题是交互式应用程序在你加载文件时挂起,那么想办法让它对用户更好——也许使用 BackgroundWorker异步加载它们,也许按文件大小的升序对图像进行排序,然后先加载小的图像以获得更好的主观性能。

关于c# - Image.FromFile 非常慢。任何替代方案,优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1053509/

相关文章:

重写与隐藏基类方法时的 C# 作用域差异

c# - Web API 调用存储过程并返回结果

c# - 覆盖 ProcessCmdKey 时如何检测 shift+tab

c# - 搜索按钮上的进度条

.net - 使用 Deleporter 进行跨进程模拟

c# - 如何获取长字符串并将其滚动到 15 个字符的文本控件/标签中?

c# - OpenQA.Selenium.WebDriverException : 'Cannot start the driver service on http://localhost:20548/'

c# 对列表进行分组并获取每组的计数

c# - 建议代码分析,处理不止一次

c# - Autofac 无法解析构造函数的参数 'System.String applicationClientId'