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

时间:2009-06-27 19:59:39

标签: c# .net winforms performance image

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

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

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

可能优化的另一件事是,加载的图像大于256x256。那么有没有办法通过先调整大小或其他东西来加载它们?如果它们的高度大于256像素,我只想统一缩放它们。

有什么想法来优化这个吗?

编辑:它们是JPEG格式。

7 个答案:

答案 0 :(得分:3)

你没有说实际上图像比256x256大了多少 - 现代数码相机的图像 大于此。

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

然后你可以决定是否有一个微妙的'Image.FromFile'问题或一个简单的'这是我的计算机/驱动器/反病毒扫描程序/网络实际上有多慢'问题。

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

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

答案 1 :(得分:2)

如果您尝试制作缩略图,请尝试使用此代码here,这样您就可以在不完全加载图像的情况下提取缩略图。

答案 2 :(得分:2)

您可以使用F reeImage.NET,非常适合在背景上加载图片。

Image.FromFile 包含隐藏的互斥锁,如果您尝试加载大型图像,即使在后台线程上也会锁定您的应用。

对于JPEG,FreeImage库使用OpenJPEG库,可以更快地加载更小规模的JPEG图像。它还可以使用嵌入的缩略图。

WPF类还允许以较小的分辨率加载图像,但如果仅限于WinForms,则无法使用此文件。

答案 3 :(得分:1)

  1. 如果你想要速度,那么预先缩放你的图像,不要在运行时这样做。
  2. 你没有提到想要加载的图像类型(jpeg,png,gif,bmp)当然bmp是最快的,因为它没有(或几乎没有)压缩。
  3. 你的图像是256色(8位w /调色板),bmp,gif和png是否支持那种加载速度非常快的格式。

答案 4 :(得分:1)

听起来你需要某种图像缩略图?不要忘记jpeg图像里面已经包含缩略图,因此您只能提取这个小图像而不需要缩放。但是这些图像小于256x256。

另一个选择是将加载逻辑移动到单独的线程中,它不会更快,但从用户的角度来看,它看起来可能是显着的加速。

答案 5 :(得分:1)

  

我有一个winforms图像列表

我会避免在这种情况下使用ImageList。在内部,它是一个旧的Windows通用控件,用于处理GUI图标,通常为32x32像素或更低。

  

可能优化的另一件事是,加载的图像大于256x256。

请注意,GDI +未针对使用照片软件通常编辑的非常大的位图进行优化。照片编辑软件包通常具有复杂的算法,可以将图像分成更小的部分,根据需要与磁盘交换部件以有效利用内存,等等。

调整图像大小会占用大量CPU资源,尤其是在使用高质量插值算法时。从Windows资源管理器如何做到这一点 - 它将缩略图保存到磁盘上的文件以供将来访问,并在后台进行处理以避免独占系统。

答案 6 :(得分:0)

这可能为时已晚,但使用ImageLocation属性会做两件事

  1. 加快图片加载

  2. 解决错误(Image file is locked when you set the PictureBox Image property to a file

    pictureBox1.ImageLocation = "image.jpg";
    
    pictureBox1 .SizeMode =  PictureBoxSizeMode.StretchImage;