Monthly Archives: December 2007

WPF и DPI

Не для кого не секрет, что в Висте можно менять DPI (dots-per-inch) для более удобной работы на мониторах с большим разрешением. Я не мог и подумать, что это может проявиться самым неожиданным образом при просмотре изображений под WPF. Любое изображение (обыкновенный JPEG) может нести в себе информацию о DPI внутри метаданных. По умолчанию равно 96 и именно это значение будет использоваться если данных нет.

Однако, некоторые программы для обработки фотографий решили, что неплохо бы 180 dpi прописать в jpg файлы. Если открыть такую фотку в классе Image, то размер ее окажется раза в два меньше ваших ожиданий (естественно, имеется ввиду режим без растяжения Stretch.None). И это еще пол беды. Хотя DPI у изображения в явном виде выставить нельзя, но можно обойти эту проблему либо использовав класс DrawingImage, либо получив PixelData и сгенерировав новый битмап из нее.

Далее меня ждал еще один сюрприз. Если выравнивание фотографии стоит по центру и разрешение ее не кратно двум, то мы получаем мыло изза того что центр изображения попадает между пикселами. Особенно это заметно при просмотре скриншетов текста. Опция SnapsToDevicePixels=Trueне помогает ничем! Пришлось в зависимости от кратности разрешения изображения изменять маргин на 1. В общем, еще то извращение, но прекрасно работает.

В завершении скажу, что пока искал решение вышеописанных проблем, наткнулся на блог, где написано, что вообще не стоит в wpf и silverlight использовать картинки с плохой масштабируемостью, то есть качество которых страдает от небольшого ресайза. Речь идет о любых изображениях с четкими гранями и текстом! Так что be aware!