Принципы формирования цветного изображения на мониторе

Цветное изображение на дисплее монитора формируется из пикселов, а
каждый пиксел состоит из компонентов трёх цветов — красного, зелёного и
синего (red, green, blue), каждый из таких компонентов называется субпикселом. Существует несколько различных вариантов геометрии субпикселов, самые главные из них — это: ЭЛТ телевизора, ЭЛТ монитора, жидкокристаллический экран. Субпикселы на них располагаются следующим образом:

Изображение:LinuxFonts-display-types.png

Особенность целовеческого зрения такова, что при достаточно
маленьких размерах субпикселов глаз перестаёт различать отдельные
красно-сине-зелёные компоненты и мозг формирует из них полноцветное
изображение как бы смешивая три цвета в нужной пропорции в зависимости
от яркости каждого цветового компонента.

На LCD-экране пикселы и субпикселы располагаются в строгом
геометрическом порядке: каждый пиксел имеет прямоугольную форму и
состоит в свою очередь из трёх вертикально расположенных субпикселов
прямоугольной формы. Таким образом, на экране размером 1024×768
пикселов физически располагается 3072×768 раздельно управляемых
светящихся элементов. Во всей оставшейся части статьи мы будем говорить
именно об LCD-экранах.

⚠
Изображения в данном разделе
предназначены для просмотра только на LCD-мониторах, на CRT-мониторах
эффект не будет совпадать с описанным!

Каждый цвет отдельного пиксела получается путём «смешивания» трёх
цветов субпикселов в разных пропорциях. Пропорция задаётся уровнем
яркости субпиксела. Чёрный цвет получается при полностью погашенных
субпикселах, белый — при полностью включенных, чистый красный цвет
получается при полностью погашенных синем и зелёном субпикселе (уровень
яркости красного субпиксела при этом определяет яркость итогового
красного цвета), а жёлтый цвет получается смешиванием красного и
зелёного в равных пропорциях.

Изображение:LinuxFonts-lcd-colors-example-1.png

При выбранном подходе серый цвет получается смешиванием в равных
долях красного, зелёного и синего цветов субпикселов и при
использовании монохромного сглаживания экран LCD-монитора при большом
увеличении выглядит приблизительно так:

Изображение:LinuxFonts-lcd-colors-greyscale-sample-1.png

Такой способ формирования цветного изображения позволяет добиваться
интересных эффектов. Рассмотрим следующую иллюстрацию (её нужно
обязательно рассматривать на LCD-мониторе):

Изображение:LinuxFonts-lcd-colors-example-2.png

На рисунке изображены шесть параллельных линий. Первые три линии
красного, зелёного и синего цвета соответственно, четвёртая белого
цвета, а пятая и шестая состоят из сегментов разных цветов. В
построении первых трёх линий задействовано только по одному из
субпикселов, в четвёртой линии — все субпикселы, по этой причине
четвёртая линия кажется визуально шире, чем первые три, хотя все они
одинаковой ширины — один пиксел. Пятая линия также шириной в один
пиксель, однако в каждом сегменте задействован только один субпиксел, в
результате чего линия кажется неровной (физически так и есть, линия
состоит из трёх сегментов, каждый из которых сдвинут вправо
относительно предыдущего на один пиксель). Шестая линия имеет ширину
два пиксела и состоит из двух трёхсегментных линий.

Давайте рассмотрим этот рисунок в масштабе 8:1.

Изображение:LinuxFonts-lcd-colors-example-3.png

Вы можете сами проделать эту операцию в любом графичесок редакторе,
чтобы убедиться, что на этих двух иллюстрациях представлено одинаковое
изображение. Теперь рассмотрим, как это избражение рисуется на экране
LCD-монитора.

Изображение:LinuxFonts-lcd-colors-example-4.png

В верхней правой части видно, что смежными сегментами оказываются
субпиксели, принадлежащие двум соседним пикселам: слева синий, справа
красный. Для глаза эти два соседних сегмента сливаются в один цвет, в
результате чего на экране получается линия пурпурного цвета. Также
видно, откуда берётся пустой промежуток между двумя соседними линиями.

Основы субпиксельного рендеринга

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

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

Изначально алгоритм субпиксельного рендеринга был разработан и запатентован IBM[15],
позднее был использован фирмой Microsoft в операционной системе Windows
XP под названием ClearType. Подробнее о принципах работы субпиксельного
сглаживания можно прочитать в статье википедии о ClearType.

весь текст страницы, начиная с этого места и до конца документа, 
является устаревшим, и будет в ближайшее время удалён

FreeType.
В отличие от Core X Renderer, работает на стороне X-клиента, а не
X-сервера. По сути это означает, что если вы запустите X-приложение на
другом физическом сервере, а в качестве дисплея укажете свой локальный,
то рендеринг шрифтов будет происходить на другом сервере, а вам будут
передаваться по сети, условно говоря, картинки с уже отрисованным
текстом. И ещё одно важное следствие, которое многие упускают — Xft не зависит от конфигурации X-сервера!
Шрифты для использования в Xft задаются совершенно отдельно от него;
приложение, использующее Xft будет выглядеть одинаково, независимо от
того, на каком именно X-сервере оно отображается.

Почти все современные X-приложения явно или косвено используют для
рендеринга шрифтов библиотеку Xft. Core X Renderer уже сильно устарел,
и не поддерживает многих популярных в настоящее время фич, например,
сглаживания шрифтов. Как я уже говорил, Xft использует непосредственно
для растеризации шрифтов библиотеку FreeType. FreeType — это
высокоэффективная, свободная, расширяемая и переносимая библиотека для
работы с разнообразным форматами шрифтов. Она есть для всех платформ и
входит во все дистрибутивы. Однако ввиду свободности некоторые
возможности библиотеки по умолчанию отключены и их нужно включать
самостоятельно и пересобирать библиотеку, чтобы их задействовать. Эти
возможности реализуют запатентованные способы рендеринга, а так как на
территории России патенты на алгоритмы не действуют, можно на это
забить и всегда эти фичи включать. Подробные инструкции, как это
сделать, доступны в сети в огромном количестве, а в некоторых
дистрибутивах, например, в Debian, эти возможности уже включены в
бинарные пакеты, поэтому нет необходимости их пересобирать. А вот
пользователям Fedora Core придётся это сделать.

Изображение:LinuxFonts-Debian-fontconfig.png

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

Чтобы полностью осознать и понять суть производимых действий, я
рекомендую по мере чтения статьи выполнять вручную все, о чём вы
прочитаете — это сильно помогает пониманию. Чтобы не сломать что-нибудь
в главном конфигурационном файле, рекомендую проделывать все действия в
специально созданном для этого окружении: Xft можно заставить
использовать другой файл конфигурации, отличный от
/etc/fonts/fonts.conf, делается это при помощи переменной окружения
FONTCONFIG_FILE, которой необходимо присвоить полный путь
(например, /home/user/my-own-fonts.conf) до нового файла. Если
переменная FONTCONFIG_FILE установлена, то все X-программы,
использующие Xft, будут искать файл конфигурации именно там, а не в
/etc/fonts/fonts.conf. Рекомендую также создать каталог, например, ~/local-font-sandbox
и все действия (создание новых файлов, например) проводить только
внутри него. Для этого открываем новый терминал, заходим внутрь этого
каталога, создаём файл fonts.conf и присваиваем переменной FONTCONFIG_FILE полный путь до него (export FONTCONFIG_FILE=`pwd`/fonts.conf),
не забываем про экспорт переменной, так как все программы, которые
будут использовтать данный файл, мы будем запускать именно из этого
терминала. В качестве тестовой программы можно взять любую,
использующую Xft, например, kword — текстовый редактор из набора
KOffice, нам он полезен тем, что в нём можно одновременно отображать
много текста, отрисованного разными шрифтами.

Изображение:LinuxFonts-Basic-fontconfig-res.png

Также можно нарваться на вот такое сообщение:

No fonts found; this probably means that the fontconfig
library is not correctly configured. You may need to
edit the fonts.conf configuration file. More information
about fontconfig can be found in the fontconfig(3) manual
page and on http://fontconfig.org

Оно означает, что приложение не хочет работать, если шрифты не
определены. Поэтому первым шагом мы добавим несколько TrueType-шрифтов
в наш тестовый каталог и пропишем их в нашем конфиге.

Итак, создаём каталог ~/my-fonts-sandbox/ttfonts, куда скопируем несколько файлов шрифтов в формате TrueType, например, DejaVuSans.ttf и DejaVuSerif.ttf, данные шрифты совершенно свободны к использованию, они входят в любой дистрибутив и их без проблем можно скачать из сети. Путь к каталогу со шрифтами задаётся тегом dir,
каталог просматривается рекурсивно, то есть нет необходимости указывать
также подкаталоги. Можно добавлять несколько таких тегов, в каждом
указывается один каталог. Проделаем все эти шаги, после чего наш
тестовый файл выглядит так:

 version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>~/my-fonts-sandbox/ttfonts</dir>
</fontconfig>

Запускаем kword и видим, что шрифты в нём отображаются, однако если
мы попытаемся изменить шрифт набранного текста, мы увидим, что выбор
ограничивается только лишь двумя этими шрифтами: DejaVuSans и
DejaVuSerif.

Изображение:LinuxFonts-Kword-basic-fonts.png

На рисунке видно, как выглядит окно kword в моей системе, когда ему
доступно всего два шрифта. Обратите внимание, что шрифты отрисовываются
в сглаженном виде, в вашем дистрибутиве всё может быть иначе.

Теперь напишем более сложный конфигурационный файл:

 version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/home/cancel/my-fonts-sandbox/ttfonts</dir>
<match target="font">
<edit mode="assign" name="antialias">
<bool>false</bool>
</edit>
</match>
</fontconfig>

В файле конфигурации содержатся правила интерпретации шрифтов,
неформально говоря, это означает, что мы определяем способ
отрисовывания шрифта посредством указания, какие именно способы к каким
шрифтам применять. В этом примере у нас имеется всего одно правило,
заданное в виде тега match, в нём говорится примерно следующее:
«Любому запрошенному шрифту запретить использование свойства
antialias», то есть сглаживание отключено глобально для всех шрифтов.
Всё очень просто, не так ли? Внутри тега match есть тег edit,
который предписывает, какое именно свойство отрисовки шрифта изменить и
какое значение этому свойству присвоить; в нашем примере это свойство antialias, которому присваивается значение false. Логично и просто.

Лирическое отступление


У тега match возможен единственный атрибут target, он
определяет, когда будет выполнено заданное внутри действие. Более
подробно об этом написано в комментариях в файле fonts.dtd; там слишком
много тонкостей, чтобы их все тут перечислять. Отмечу лишь, что можно
относительно безболезненно вообще не указывать этот атрибут, однако
можно указать и target=»font».

Вы, наверное, уже отметили, что шрифты на скриншоте выглядят не
очень хорошо, значит, нужно изменить ещё какие-нибудь атрибуты
отрисовки, чтобы стало лучше. Вот об этих атрибутах и поговорим. Но
сначала немного теории, а точнее — о различных особенностях отрисовки
шрифтов на мониторе. Без этой информации смысл различных опций файла
конфигурации останется для вас не совсем ясным.

в этой статье Википедии.

Вот несколько примеров, на всех иллюстрациях в верхнем левом углу
нарисовано тестовое слово, в центре — оно же, но увеличенно в четыре
раза.

Простейший способ растеризации — это простое преобразование
векторных изображений в растровые безо всякой коррекции, выглядит это
примерно так:

Изображение:LinuxFonts-Rasterization-simple.png

Простейшее сглаживание достигается путём добавления вокруг каждого
пиксела в несглаженном растровом изображении нескольких пикселов с
разной степенью прозрачности, обычно более светлых, такой метод
называется greyscale antialiasing, я далее буду его называть монохромным сглаживанием. Это позволяет получить более сглаженную, но несколько замыленную картинку:

Изображение:LinuxFonts-Rasterization-antialiasing-without-hinting.png

В качественных шрифтах для каждого глифа добавляются специальные
инструкции (хинты, hints), чтобы помочь отрисовать шрифт на устройствах
вывода низкого разрешения, например, на экране монитора. Создание
качественных хинтов — это весьма трудоёмкий процесс и поэтому хинты
присутствуют далеко не в каждом шрифте, однако во всех стандартных
шрифтах Windows™ они присутствуют (и ОЧЕНЬ качественные), поэтому они и
отрисовываются там так хорошо. Рассмотрим, как будет растеризован
библиотекой FreeType шрифт Tahoma (размер 12 пунктов) без использования
хинтов:

Изображение:Rasterization-no-hinting.png

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

Изображение:LinuxFonts-Rasterization-no-hinting-antialias.png

Однако всё равно шрифт отрисовывается не идеально — штрих получается
слишком широкий, видны торчащие из шрифта пиксели. Теперь посмотрите на
эту же надпись, но выполненную с применением хинтов и без антиалиасинга:

Изображение:LinuxFonts-Rasterization-hinting-full-alias.png

Очень хороший результат: все символы отрисованы симметрично, лишние
пикселы ниоткуда не торчат, на экране ЭЛТ-монитора шрифт, отрисованный
таким методом будет выглядеть вполне приемлемо и качественно.
Монохромное сглаживание ещё больше улучшает качество отрисовки (Tahoma,
12 pt):

Изображение:LinuxFonts-Rasterization-hinting-full-antialias.png

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

Обычно на экране цветного монитора каждый пиксел формируется из трёх
цветных фрагментов — красного (red), зелёного (green) и синего (blue).
В ЭЛТ-мониторах
изображение формируется таким образом, что даже несглаженный шрифт
смотрится там вполне удовлетворительно, в основном оттого, что цветные
фрагменты, из которых состоит изображение, имеют не совсем правильную
прямоугольную форму и несколько размытые границы. На жидкокристалических (LCD)
же экранах цветные фрагменты строго прямоугольны и расположены в
строгом порядке, поэтому ну них резкие переходы между элементами шрифта
заметны очень хорошо, особенно это проявляется на экранах с небольшим
разрешением и большим физическим размером, например, на матрице с
диагональю экрана 15″ и разрешением 800×600 пикселов. На LCD-экране
каждый пиксел формируется из трёх вертикальных (чаще всего, но возможно
и горизонтальное расположение) прямоугольников красного, зелёного и
синего цветов. Варьируя яркость каждого такого субпиксела, можно
получить всю гамму цветов. Строгая геометрическая упорядоченности
субпикселов используется в характерном именно для LCD-матриц
сглаживании — так называемом субпиксельном сглаживании (subpixel antialiasing).

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

Изображение:LinuxFonts-Rasterization-hinting-full-antialias-subpixel.png

На увеличенном фрагменте чётко видны цветные пикселы, однако на
самой картинке они не очень заметны и в целом отрисовка выглядит более
«гладкой», чем при использовании монохромного сглаживания. Обратите внимание, что если вы просматриваете эту страницу на экране ЭЛТ-монитора, вы увидите совершенно иную картину!
Всё дело в том, то эта иллюстрация сделана простым масштабированием
скриншота, а чтобы совсем понять схему работы метода (и увидеть
физические фрагменты пикселов), необходимо сделать фотографию фрагмента
экрана, на котором написано это слово. Например, надпись белым цветом
на чёрном фоне на LCD-экране выглядит примерно следующим образом (при
достаточно сильном увеличении):

Изображение:Screenshot-subpixeRGB.png

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

Изображение:LinuxFonts-Rasterization-hinting-full-antialias.png

Сравните с бесхинтовым сглаживанием того же самого шрифта того же самого размера:

Изображение:LinuxFonts-Rasterization-no-hinting-antialias.png

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

Комментарии закрыты.

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34