Описание
В настоящее время я работаю над приложением, которое должно отображать большой прокручиваемый список изображений (> 100 изображений Tiff, 2480 * 3507, 1,1 МБ). Изображения хранятся локально во временных файлах, а затем доступны через контроль изображения. Проблема заключается в том, что каждое изображение имеет размер около 36 МБ, когда оно не сжато в растровое изображение, а использование памяти достигает максимума (~ 1,5 ГБ) даже при использовании виртуализации пользовательского интерфейса, поскольку оно освобождает память только тогда, когда она ему нравится. Также это вызывает проблемы при прокрутке списка.
Таким образом, в основном есть две проблемы, которые несколько запутаны:
- Высокое использование памяти из-за большого количества файлов, что вынуждает нас использовать пользовательский интерфейс. Виртуализация
- Замедленная прокрутка, так как изображения должны быть загружены с диска после их выбрасывания
Моя попытка решить эту проблему
После прочтения документа MS Моя первая попытка решить эту проблему состояла в том, чтобы использовать « BitmapImage » и DecodePixelHeight / Width для уменьшения разрешения при декодировании изображения. Это помогает, но также сжимает изображение при отображении. Поэтому я добавил шкалу Transform, чтобы противостоять этому эффекту. Это работает несколько, но мне кажется, что я не хочу делать это, и я не хочу делать выборку.
Это код XAML для шаблона, использованного в списке:
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type viewModels:BitmapImageViewModel}">
<Image Source="{Binding BitmapImageSource}"
Stretch="UniformToFill"
StretchDirection="Both"
RenderOptions.BitmapScalingMode="LowQuality"
UseLayoutRounding="True">
<Image.LayoutTransform>
<ScaleTransform ScaleX="{Binding ResizeFactor}"
ScaleY="{Binding ResizeFactor}" />
</Image.LayoutTransform>
</Image>
</DataTemplate>
</ListView.ItemTemplate>
BitmapImageSource is of Введите BitmapImage
Вопрос
Как можно уменьшить интенсивное использование памяти и, возможно, даже загрузить изображения в фоновом режиме?
Как это можно решить в других приложениях, для которых необходимо отображать много изображений? Мне интересно, пропускаю ли я что-то. NET предложений или какой-нибудь пакет библиотеки / nuGet, способный справиться с этим. Я впервые интенсивно работаю с изображениями в C# и не нашел много хороших источников о том, как с этим обращаться.