Эффективное отображение и масштабирование / панорамирование больших изображений в WPF

#c# #wpf #zooming #imaging #pan

#c# #wpf #масштабирование #создание изображений #панорамирование

Вопрос:

В настоящее время я работаю над приложением, которому необходимо отображать большие инженерные чертежи размером 8800×6800 или больше. В требованиях указано, что пользователь должен иметь возможность панорамировать изображение. В идеале, они хотели бы также иметь возможность комментировать изображения. Если вы посмотрите на Windows Photo Viewer, вы увидите производительность и функции, которые я собираюсь имитировать, за вычетом части аннотаций.

До сих пор я пробовал несколько разных подходов к отображению изображений, и, похоже, ни один из них не обеспечивает той производительности, которую я ищу. Они либо занимают много памяти, либо работают медленно. Вот подходы, которые я использовал:

  • Viewbox с Image в качестве дочернего элемента. Использование памяти в порядке, но изменение размера Viewbox происходит медленно. Из-за этого я еще не пробовал масштабирование / панорамирование с помощью этого подхода.
  • InkCanvas с Image набором либо в качестве фона, либо в качестве дочернего элемента. При таком подходе масштабирование / панорамирование с помощью ScaleTransform и TranslateTransform казалось так себе, но использование памяти могло быть в диапазоне 450-600 МБ.

Это мой первый опыт работы с изображениями с помощью .NET / WPF, и мои знания по этому вопросу довольно ограничены. Каковы некоторые рекомендации по работе с большими изображениями, особенно с WPF? Я читал, что разбиение изображения на плитки (например, глубокое масштабирование) может помочь, но не был уверен, как это сделать, или это лучшая идея в моей ситуации. Знаете ли вы какие-либо ресурсы, которые могли бы помочь мне лучше понять это?

Комментарии:

1. Вы решили эту проблему в конце концов?

Ответ №1:

Под «разбиением на листы», если вы подразумеваете разделение изображения на отдельные части и одновременное отображение только небольшого подмножества для повышения производительности, это можно было бы назвать «виртуализацией».

У Microsoft есть отличный блог о виртуализации элементов и даже предоставляется эталонная реализация VirtualCanvas, которую вы можете использовать в качестве отправной точки для виртуализированного элемента управления.

Ссылка здесь:https://learn.microsoft.com/en-us/archive/blogs/jgoldb/virtualized-wpf-canvas

Обратите внимание, что в этом блоге масштабирование включено как часть обсуждения, а также обсуждение плавной прокрутки и упреждающей загрузки плиток для лучшей отзывчивости пользовательского интерфейса.