Изобразяване на изображения чрез WPF с използване на Pivot като пример

изобразяване
Pivot няма нужда от представяне. Ако поставите тази дума в търсенето на habr, резултатът ще бъде 37 статии, сред които има както рецензии, така и уроци. Затова реших да насоча усилията си само към един аспект от работата с Pivot – върху картинки.

Удобството при работа с Pivot силно зависи от изображенията, избрани за него. Снимки с ниска разделителна способност или различни размери и стилове могат да развалят цялото впечатление. Има и ситуации, когато изобщо няма снимки и не може да има, тъй като всички данни са в базата данни под формата на числа, низове и дати.

Има много начини за програмно генериране на изображения от шаблон. Един от тях дори е вграден в библиотеката PautorLib, която помага за подготовката на данни във формат, който PivotViewer разбира. Той използва HTML като шаблон.

В тази статия ще разгледам разрешаването на проблема с помощта на WPF. Шаблонът в нашия случай ще бъде UserControl, който може да съдържа различни TextBlock и Image, чиито свойства могат да бъдат зададени в кода. За да не бъдем неоснователни, нека разгледаме всичко с пример.

Например, взета е информация за първите хиляда потребители от върха на Habr. За това беше написан бот, който бавно събра всички данни и ги постави в MongoDB.

Клас, който взема потребителски данни и ги преобразува в изображение, изглежда по следния начин (pastebin).

В резултат на това се получиха следните снимки:

pivot

За да постигнете това качество на шрифтовете, трябва да зададете следните свойства в шаблона:

За да изчертаете контролата в изображение, се използва класът RenderTargetBitmap. Има своя особеност - изходните изображения имат нечовешки формат Pbgra32. Други формати не се поддържат. Следователно трябва допълнително да пуснете полученото растерно изображение през класаFormatConvertedBitmap за получаване на Rgb24 изход. След това резултатът се кодира в PNG чрез PngBitmapEncoder и се записва във файл.

Всичко това се случва на таймер (DispatcherTimer) и изглежда така - таймерът се задейства, шаблонът се попълва с нови данни, таймерът задейства отново, преначертаният прозорец с нови данни се преобразува в картина.

Цялата тази икономика с таймер, шаблон и прозорец се стартира в отделна STA нишка, както се изисква от WPF. Нишката на свой ред се стартира чрез извикване на функцията.

Що се отнася до скоростта на такова решение, основното ограничение тук е скоростта на запис на твърдия диск.

И накрая, тук можете да намерите получения Pivot. Напомням ви, че това са първите хиляда души от върха на Хабр. Чрез търсенето можете да търсите по UserName и DisplayName. Други свойства могат да бъдат филтрирани, сортирани и групирани. Ето няколко скрийншота за тези, които по една или друга причина не могат да го видят: img1, img2, img3, img4, img5, img6.

Hardcore conf в C++. Каним само професионалисти.