BitmapImage DecodePixelWidth奇怪的行为

我在显示大量图像时遇到了一些性能问题,我发现问题是当我真的只需要一个小于1/4大小的图像时,正在使用全分辨率图像。 所以我在BeginInit和EndInit之间添加了一行来将DecodePixelWidth设置为200,这是我在布局中需要的最大宽度。 我的表现不再是问题,但有些图像非常小,绝对不会接近200像素宽。 大多数图像似乎都能正确显示,并且似乎没有任何押韵或理由太小而且工作正常。 我认为这可能是由于图像原始尺寸的差异,但结果没有模式。 我尝试将宽度高达600,然后允许有问题的图像以200的正确宽度显示,但性能会受到影响。

在这一点上,我甚至不确定从哪里开始寻找,并且真的很感激能够向正确的方向迈进。

编辑:下面有关图像以及我如何使用它们的更多信息。

大多数图像大约是1000X1500,尽管有些图像有1000×1513等奇数尺寸。 所有图像都是JPEG。 目前,每个图像都放在我设计的自定义用户控件中,没有什么太花哨的只是它周围的背景和一些文本。 然后将每个用户控件放置在其自己的行/列中的网格中。 网格位于滚动查看器内,因此用户可以滚动列表。 这可能不是实现我正在寻找的最佳方式,但它是我快速提出的,它在大多数情况下都有效。 我很乐意切换到另一种显示方法,如果它能以更简单或更简洁的方式完成我想要的。

预期的结果是电影浏览应用程序。 将有一个可滚动的电影列表,每个电影都表示为自己的图块,包括标题,电影海报,流派信息,评级和描述。 此列表将对各种项目进行排序。 有关电影的信息存储在另一台机器上的sql数据库中。 图像最初存储在另一台计算机上,但在本地复制以提高性能。

编辑:我已经能够通过不使用DecodePixelWidth来解决问题,而是以所需的大小保存图像的副本,这提高了性能。 Youngjae建议不使用DecodePixelWidth以及他提到使用虚拟化列表,这使我得到了以下关于创建虚拟化包装面板的文章,这些文章应解决任何其他性能问题。 这篇文章是针对silverlight的,但据我所知,silverlight基本上是wpf的淡化版本,如果它在silverlight中工作,它应该在wpf中工作。 将它转换为我的用途应该不会太难。

第1部分 – MeasureOverride

第2部分 – ArrangeOverride

第3部分 – 动画

第4部分 – 虚拟化

在MSDN链接中 ,您可以找到如下的单词。

JPEG和便携式网络图形(PNG)编解码器本地将图像解码为指定大小; 其他编解码器以原始大小解码图像并将图像缩放到所需大小。

并且,由于上述原因,我建议您不要使用DecodePixelWidth来resize。

我不知道您的原始图像大小和格式,但是不足以使用虚拟列表和