Элемент управления изображения WPF уничтожает большие растровые изображения - PullRequest
0 голосов
/ 16 июня 2020

Я пишу приложение для просмотра изображений, которое загружает большие неподвижные изображения. Я должен иметь возможность увеличивать масштаб до 1: 1, чтобы измерить точные пиксельные координаты элементов изображения. Я использую размещенный здесь элемент управления Viewport, который отлично подходит для масштабирования и панорамирования. Я могу загрузить изображение tiff размером 150 МП с помощью BitmapDecoder, и его количество пикселей верное 14000 x 10000. Однако, когда я назначаю это растровое изображение свойству Image.Source, оно уменьшается примерно до 15 МП:

sourceBitmap.PixelWidth = 14204

sourceBitmap.PixelHeight = 10652

После присвоения этого растрового изображения image1.Source мы получаем

image1.Source.Width = 4545.27 ...

image1.Source.Height = 3408.64 ...

Я знаю о безразмерном контексте графики WPF и могу отрегулировать масштабные коэффициенты для чтения исходных координат, но есть риск ошибок округления и Я работаю над масштабированной копией, которая ухудшает исходное разрешение изображения. Согласно документации Microsoft, растровое изображение WPF может иметь размер до 64 ГБ, но элемент управления Image, похоже, не предназначен для работы с растровыми изображениями размером более 15MP. Установка Stretch на «None» только усугубляет ситуацию. Он обрезает изображение до верхнего левого угла 4545 x 3408 пикселей от источника и отображает его очень маленьким, почти как миниатюру вместо 1: 1.

Есть ли способ обойти это ограничение?

1 Ответ

2 голосов
/ 16 июня 2020

В отличие от BitmapSource PixelWidth и PixelHeight, значения Width и Height зависят от его DPI (точек на дюйм), который является тегом TIFF или EXIF ​​в файле изображения.

Значения идентичны при разрешении 96 точек на дюйм, в противном случае рассчитывается как

Width = PixelWidth * 96 / DpiX
Height = PixelHeight * 96 / DpiY

Очевидно, ваши изображения имеют теги 300 точек на дюйм.

Это никоим образом не влияет на пиксель count, но просто определяет собственный, нерастянутый размер растрового изображения, когда он отображается в элементе Image или ImageBru sh.


Вместо использования ширины и высоты просто продолжайте использовать PixelWidth и PixelHeight:

var bitmap = (BitmapSource)image1.Source;
var width = bitmap.PixelWidth;
var height = bitmap.PixelHeight;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...