C# Память WPF и проблемы с отображением при работе с длинным списком больших изображений - PullRequest
0 голосов
/ 17 апреля 2020

Описание

В настоящее время я работаю над приложением, которое должно отображать большой прокручиваемый список изображений (> 100 изображений Tiff, 2480 * 3507, 1,1 МБ). Изображения хранятся локально во временных файлах, а затем доступны через контроль изображения. Проблема заключается в том, что каждое изображение имеет размер около 36 МБ, когда оно не сжато в растровое изображение, а использование памяти достигает максимума (~ 1,5 ГБ) даже при использовании виртуализации пользовательского интерфейса, поскольку оно освобождает память только тогда, когда она ему нравится. Также это вызывает проблемы при прокрутке списка.

Таким образом, в основном есть две проблемы, которые несколько запутаны:

  1. Высокое использование памяти из-за большого количества файлов, что вынуждает нас использовать пользовательский интерфейс. Виртуализация
  2. Замедленная прокрутка, так как изображения должны быть загружены с диска после их выбрасывания

Моя попытка решить эту проблему

После прочтения документа 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# и не нашел много хороших источников о том, как с этим обращаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...