2013-02-04 104 views
2

顯示大量的圖像時,我正在經歷一些性能問題,我發現這個問題是,當我真的只需要一個比尺寸的1/4的圖像較少被使用的全分辨率圖像。因此,我在BeginInit和EndInit之間添加了一行,將DecodePixelWidth設置爲200,這是我在佈局中需要的最大寬度。我的表現不再是問題,但一些圖像非常小,絕對沒有接近200像素寬。大部分圖像似乎都能正確顯示,而且似乎沒有任何韻律或原因,哪些太小而哪些正常工作。我認爲這可能是由於圖像原始尺寸的差異,但結果沒有任何模式。我嘗試將寬度增加到600,然後允許違規圖像以200的正確寬度顯示,但是性能受到影響。的BitmapImage DecodePixelWidth古怪行爲

在這一點上,我甚至不知道從哪裏開始尋找,並會在正確的方向踢真的很感激。

編輯:低於圖像,以及如何我使用它們的更多信息。

大部分圖片都是圍繞1000X1500一些雖然奇數維像1000x1513。所有的圖像都是JPEG。目前,每個圖像都放置在我設計的自定義用戶控件中,沒有什麼太花哨只是用一些文字圍繞它的背景。然後將每個用戶控件放置在其自己的行/列中的網格中。網格位於滾動查看器中,因此用戶可以滾動瀏覽列表。這可能不是完成我所尋找的最好的方式,但它是我很快就想出來的,並且它在很大程度上起作用。如果能以更簡單或更簡潔的方式完成我想要的功能,我很樂意切換到另一種顯示方式。

預期的結果是電影瀏覽應用程序。將會有一個可滾動的電影列表,每個電影都以其自己的瓷磚表示,並標題,電影海報,流派信息,評級和說明。該列表可以在各種項目上排序。關於電影的信息存儲在另一臺機器上的sql數據庫中。這些圖像最初存儲在另一臺機器上,但本地複製以提高性能。

編輯:我已經能夠通過不使用DecodePixelWidth,並在需要的大小,而不是保存圖像的副本來解決問題,這提高了性能。 Youngjae建議不使用DecodePixelWidth以及他提到的使用虛擬化列表時,向我提供了以下關於創建虛擬化包裝面板的文章,這些文章應解決任何其他性能問題。這篇文章是針對silverlight的,但是從我所瞭解的silverlight基本上來說是一個wpf的淡化版本,如果它在Silverlight中工作,它應該可以在wpf中工作。將它轉換爲我的用途應該不會太困難。

Part 1 - MeasureOverride

Part 2 - ArrangeOverride

Part 3 - Animation

Part 4 - Virtualization

回答

2

MSDN link,你可以按照以下找到的話。

JPEG和便攜式網絡圖形(PNG)編解碼器本地解碼圖像到指定的大小;其他編解碼器會以原始大小對圖像進行解碼並將圖像縮放到所需的大小。

而且,由於上述原因,我建議您不要使用DecodePixelWidth來調整大小。

我不知道您的原始圖像的大小和格式,但不足以用於虛擬化列表和<Image Width="200" Stretch="Uniform">

+0

我不確定當你說'使用虛擬化列表'時你指的是什麼。我的圖像寬度設置爲200,並將拉伸模式設置爲「均勻」。我已經在上面編輯了我的帖子,詳細介紹了我正在做的事情以及關於我正在使用的圖像的更多信息。謝謝你的幫助。 – OriginalMoose

+0

我將繼續並將您的答案標記爲正確答案。您的回答引導我通過Google找到我在上面的問題中添加的一組文章。第四篇文章討論創建一個虛擬化包裝面板。通過一些修改,它應該可以很好地適用於我的項目。謝謝你的幫助。 – OriginalMoose