О блоге

Все новые материалы размещаются на Блогосайте alv.me. Старые - в процессе переноса.

26.07.2008

FreeBSD: графика в консоли

2002 г

Казалось бы, текстовый режим системной консоли и работа с графикой суть вещи несовместные. И действительно, консоль - не самое подходящее место для редактирования полноцветных фотореалистических изображений или сложной векторной графики. Особенно во FreeBSD, где графическая ипостась консоли (посредством frame buffer), в отличие от Linux, реализован так себе (на 2002-й год - ныне в этом отношении достигнут большой прогресс). Однако кое-какие манипуляции с изображениями можно производить и здесь.

На протяжении всего времени работы с Linux'ом меня угнетала невозможность изготовления истинных скриншотов консольных программ (слепок их в терминальном окне не всегда даёт адекватное представление). Пока во FreeBSD не обнаружилось неожиданное решение. Это была утилитка под названием scr2png, входящая в систему портов и доступная также как бинарный пакет. Именно для создания консольных скриншотов и приспособленная. Принцип ее действия основывался на двух особенностях системной консоли FreeBSD: возможности создания дампа экранного буфера и подгрузки шрифтов. И за ту, и за другую отвечает команда vidcontrol, управляющая, как можно догадаться из названия, всем, имеющим отношение к консольному дисплею. Соответственно, scr2png способна функционировать только в связке с последней. Но зато - вполне справно.

Сам по себе дамп экрана текущей консоли создается командой

$ vidcontrol -p

в бинарном формате, или

$ vidcontrol -P

в текстовом, с игнорирование непечатных символов и текстовых атрибутов. Разумеется, такой дамп может быть изготовлен и для любой иной, отличной от текущей, виртуальной консоли - следует только перенаправить ее на стандартный ввод команды vidcontrol:

$ vidcontrol -p < /dev/ttyv#

И в любом случае вывод команды может быть перенаправлен в файл, однако само по себе радости это доставит мало - нужно обладать изрядной фантазией, чтобы принять этакий dump за изображение чего либо, имеющего быть на консоли.

Программа же scr2png просто-напросто конвертирует экранный дамп в графический файл - как не трудно догадаться из ее названия, формата именно PNG, а не какого-либо другого. Но не просто, а с учетом экранного шрифта. Который в принципе не обязан совпадать с загруженным в настоящий момент. Отсюда синтаксис команды:

$ scr2png -f имя_шрифта

где в качестве аргумента можно взять любой шрифт из каталога /usr/share/syscons/fonts/ (причем путь к шрифтовому файлу должен быть указан в явном виде). Разумеется, если есть желание воспроизвести русский текст, шрифт этот должен содержать символы кириллицы в должной кодировке. А для воспроизведения именно копии экрана консольный шрифт и шрифт для scr2png должны совпадать - правда, в этом случае аргумент можно не указывать вообще. Хотя, с другой стороны, это - один из способов проверить, как будет выглядеть экран при другом консольном шрифте, не загружая последний на самом деле.

Продолжим, однако, об изготовлении скриншотов. И указанная выше команда не приведет ни к какому результату (даже к возврату приглашения командной строки). Потому что все описанное хозяйство нужно объединить в командную конструкцию с соответствующим перенаправлением ввода и вывода. Сделать это можно двояким способом. Во-первых, через промежуточный scr-файл:

$ vidcontrol -p > shot.scr; \
scr2png <> shot.png

Во-вторых, конвейеризацией команд:

$ vidcontrol -p | scr2png > shot.png

В обоих случаях в итоге будет образован графический слепок экрана текущей консоли (файл shot.png). Однако такой слепок может быть получен и для любой другой доступной консоли, для чего она должна быть указана в качестве устройства ввода команды vidcontrol:

$ vidcontrol -p < /dev/ttyv# > shot.scr;
$ scr2png <> shot.png

или

$ vidcontrol -p < /dev/ttyv# | scr2png > shot.png

Наконец, если есть желание посмотреть на вид консоли при каком-либо другом шрифте, его следует задать явно:

$ vidcontrol -p < /dev/ttyv0 | scr2png \
/usr/share/syscons/fonts/866-sans-8x16.fnt > \
~/work/images/shot.png

Именно посредством программы scr2png я делал скриншоты консольных программ для FreeBSD во всех своих публикациях. Возможно, качество их не всегда соответствует идеалу. Но какая другая система позволяет в принципе делать графические слепки программ текстового режима?