我有一个winforms图像列表,其中包含200张图像256x256。
我使用方法Images.FromFile
加载图像,然后将它们添加到图像列表中。
根据ANTS .NET分析器,程序的一半时间花在Images.FromFile
上。有没有更好的方法来加载图像以添加到图像列表?
可能优化的另一件事是,加载的图像大于256x256。那么有没有办法通过先调整大小或其他东西来加载它们?如果它们的高度大于256像素,我只想统一缩放它们。
有什么想法来优化这个吗?
编辑:它们是JPEG格式。
答案 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)
答案 4 :(得分:1)
听起来你需要某种图像缩略图?不要忘记jpeg图像里面已经包含缩略图,因此您只能提取这个小图像而不需要缩放。但是这些图像小于256x256。
另一个选择是将加载逻辑移动到单独的线程中,它不会更快,但从用户的角度来看,它看起来可能是显着的加速。
答案 5 :(得分:1)
我有一个winforms图像列表
我会避免在这种情况下使用ImageList
。在内部,它是一个旧的Windows通用控件,用于处理GUI图标,通常为32x32像素或更低。
可能优化的另一件事是,加载的图像大于256x256。
请注意,GDI +未针对使用照片软件通常编辑的非常大的位图进行优化。照片编辑软件包通常具有复杂的算法,可以将图像分成更小的部分,根据需要与磁盘交换部件以有效利用内存,等等。
调整图像大小会占用大量CPU资源,尤其是在使用高质量插值算法时。从Windows资源管理器如何做到这一点 - 它将缩略图保存到磁盘上的文件以供将来访问,并在后台进行处理以避免独占系统。
答案 6 :(得分:0)
这可能为时已晚,但使用ImageLocation
属性会做两件事
加快图片加载
解决错误(Image file is locked when you set the PictureBox Image property to a file)
pictureBox1.ImageLocation = "image.jpg";
pictureBox1 .SizeMode = PictureBoxSizeMode.StretchImage;