Category Archives: WPF (.Net 3.0)

Баг поворота BitmapImage

Вчера обнаружилось, что простой код, который поворачивает картинку средствами декодера, будучи примененным к обычной фотографии с цифровика(3mpix jpeg) просто виснет под Windows XP загружая процессор при этом на 100%.

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.UriSource = new Uri(FileName);
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bmp.Rotation = Rotation.Rotate90;
bmp.EndInit();

Это происходит только под Windows XP, под Vista все работает прекрасно.

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!

Чтение и запись метаданных (Exif) под WPF

Exif – один из форматов данных, в котором содержится дополнительная информация о изображении (JPEG, TIFF). Это может быть краткая информация о названии и авторе, или о том когда был сделан снимок. Это может быть также подробная информация о параметрах устройства, при помощи которого изображение было получено.

С чтением и записью Exif-а под WPF оказалось не совсем все очевидно. Вся проблема в многообразии форматов, а также в попытке микрософта все унифицировать и предложить свой формат.

Получить основную информацию достаточно легко:

Stream imageStreamSource = new FileStream(fn, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
BitmapDecoder decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
InPlaceBitmapMetadataWriter pngInplace = decoder.Frames[0].CreateInPlaceBitmapMetadataWriter();

if (pngInplace != null)
{
if (pngInplace.CameraModel != null)
  tbExifInfo.Text = pngInplace.CameraModel.ToString();
else
  tbExifInfo.Text = "не указана";
}
else
  tbExifInfo.Text = "не возможно получить метаданные";

Вот с записью Exif возникают некоторые проблемы. В документации слабо освещен тот момент, что нужно обязательно указать отступ – место, которое выделяется для хранения данных:
Continue reading

Тормоза WPF

Допустим Вы поместили в одну из ячеек Grid’а ListBox, в который загрузили список шрифтов, которые есть у вас в системе. При этом размер ячейки Вы не выставляли, а оставили автоматическим. Естественно, чтоб использовать на полную WPF, Вы сделаете отображение написания шрифтов прямо в листбоксе. Например, так:

 

И все это будет отлично работать. Но если у Вас в системе установлено 10 тысяч шрифтов, то все уже не будет так радужно. Появятся тормоза при прокрутке листбокса.

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

Электронные книги по WPF

Адекватную литературу по .Net 3.0 сейчас можно найти только на английском языке. Если кто-то знает какие-то русские книжки, то прошу отметиться в комментариях. 

Хочу порекомендовать пару сайтиков для поиска книг:

Поисковый движок электронных книг: vestigo

И, собственно, сайт с книжками в pdf формате: http://www.pdfchm.com

В частности, с него я скачал:
Windows Presentation Foundation Unleashed (WPF)
Essential Windows Presentation Foundation (WPF) (Microsoft .NET Development Series)
Foundations of WPF: An Introduction to Windows Presentation Foundation

Сайт требует регистрации, но она не сложна. Интересно, что при регистрации вы должны подтвердить соглашение, в котором написано, что вы выделяете на своем компьютере место для части (филиала) библиотеки:

Each member of our organization agrees to give gratuitously a part of the disk space in temporary using to library for temporary storage of electronic copies of the product. The disk space given in temporary using is an integral part of library, i.e. is a part of its room.

According to the law on the copyright and the adjacent rights of the Russian Federation, with changes come into force from September, 1st, 2006, clause 19 item 2: ” granting in temporary gratuitous using libraries of copies of the products entered into a civil turn lawful by Is supposed without the consent of the author and without payment of the award. Thus copies of the products expressed in the digital form, including copies of the products given by way of mutual use of library resources, can be given in temporary gratuitous using only in rooms of libraries”.

Таким элегантным методом обходится наше законодательство. :-)

Конечно, хорошие книжки лучше иметь в печатном виде. Чтоб они красиво стояли на полочке рядом с компьютером и можно было в любой момент открыть и почитать. Так что после оценки книги добро пожаловать на Amazon.

Грядет ли эра SilverLight?

SilverLight – это переименованный WPF/E, то есть WPF Everywhere. Под “везде” подразумеваются интернет браузеры. Думаю все, кто что-нибудь делал на WPF, думали о том, как было бы не плохо на WPF  создавать сайты со сложным функционалом и богатым интерфейсом. Видимо данной мечте суждено сбыться, ибо SilverLight – это уже реальность. 

Сейчас существует 2 версии SilverLight: 1.0 и 1.1. Первая из них по сути является некой промежуточной версией все еще основанной на яве, но уже обладающей богатыми мультимедийными возможностями. Однако этого явно недостаточно чтоб потеснить Flash.

Но вот версия 1.1 уже радикально отличается тем, использует другое ядро, которое полностью основано на третьем фрейморке, и, соответственно, имеет те же возможности. Помимо этого обещана производительность в 250 раз быстрее Java Script. Инсталляция занимает 4 мегабайта. Ну и главное – разработка полностью на С#. :-)

SilverLight 1.1 сейчас еще доступен только в виде альфа версии, но видно что над ним активно работают, и скоро нас ждет финал.

Напоследок пару ссылок на примеры (хотя они не передают всего прогресса) :

Surface
Xps viewer
Earth game

Построение графиков на WPF (.Net 3.0)

[ratings] Недавно возникла необходимость построить пару графиков. Это были результаты расчета некой физической модели. И я решил, что было бы удобно построить их прямо в рассчитывающей программе с помощью WPF (.Net 3.0). Хотя задача довольно проста, можно долго копаться в хелпе, ища как сделать ту или иную вещь. Поэтому приведу тут исчерпывающий пример, который ответит на многие вопросы.

При построении графика можно пользоваться разными подходами. Я пользуюсь здесь геометрическими классами, которые позволяют создать векторное изображение. То есть можно будет изменять масштабы картинки с графиком, а качество будет идеальным. Также можно будет качественно распечатать изображение.

график

Continue reading