2016-08-24 4 views
3

Быстрый вопрос:Почему это растровое изображение меняет свой размер после загрузки?

Я это 1000 х 1000 растровое изображение:

enter image description here

и я использую эту процедуру, чтобы загрузить его:

private BitmapSource initialBitmap = new BitmapImage(new Uri("C:\\Users\\...\\Desktop\\Original.bmp")); 

Почему после того, как я загрузить его , и сразу после того, как я перехожу на вышеприведенную строку, я вижу это как 800 x 800?

enter image description here

P.S Я хочу, чтобы это было 1000 х 1000 и без использования каких-либо функций Изменить размер. Он работал, и вдруг это 800 * 800!

+0

Может быть, это какой-то вопрос DPI. Я не хочу больше говорить, потому что я ненавижу думать о DPI – musefan

+0

@musefan Я все еще на одной машине. Он работал и загружался как 1000x1000. Как только я удалил старое изображение (по ошибке) и создал новый, он начал загружаться как 800x800 –

+1

ну ... в этом случае он должен работать нормально, и нет проблем ... – musefan

ответ

4

Значения возвращаемый BitmapSource.Width и BitmapSource.Height не в пикселях, а аппаратно-независимые единицы WPF в, которые всегда 96 точек на дюйм , Например:

Получает ширину растрового изображения в устройствах, не зависящих от устройства (1/96-й дюйм на устройство).

Если вы хотите узнать фактическую ширину пикселей и высоту, вы должны использовать PixelWidth и PixelHeight свойства.

Ваш вопрос не очень конкретный, но если вы действительно обеспокоены наличием растрового дисплея того же размера, в котором он был создан, самым простым решением является удостовериться, что вы его создаете с разрешением 96 точек на дюйм. Любая программа, которую вы используете для создания растрового изображения, вероятно, имеет место, где вы можете установить растровое разрешение. Обычно это может быть задано с или без изменения размеров изображения изображения (то есть масштабирование изображения больше или меньше); вы хотите сделать это без масштабирования изображения, так что размеры пикселей остаются теми же, но изменения dpi изменяются в соответствии с тем, что использует WPF.

Обратите внимание, что это все равно не гарантирует отображение растровых изображений с определенным размером пикселя. Разрешение экрана может быть и часто отличается от 96 dpi, и в этом случае WPF будет масштабировать изображения, чтобы гарантировать, что физические размеры изображения (т. Е. Размеры в дюймах, миллиметры и т. Д.) Являются правильными в соответствии с информацией в растровом изображении , Например, ширина экрана 960 пикселей с разрешением 96 точек на дюйм имеет ширину 10 дюймов. На дисплее с разрешением 120 точек на дюйм это означает, что битмап достаточно большой, так что его ширина использует 1200 пикселей дисплея.

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


Вот некоторые другие связанные с переполнением стека вопросы, которые могут оказаться полезными: RenderTargetBitmap renders image of a wrong size
WPF for LCD screen Full HD
Screen Resolution Problem In WPF?

3

Это по дизайну. Обратите внимание, что для MSDN documentationBitmapSource.Width/Height:

Получает ширину растрового изображения в аппаратно-независимых единицах (1/96-й дюйм за единицу). (Переопределяет ImageSource.Width.)

Вместо этого следует использовать свойство PixelWidth/PixelHeight:

Получает ширину битовой карты в пикселях.

Довольно запутанным выбор или термины, имо, но там вы идете ..

Смежные вопросы