Что такое гамма коррекция в электронной книге
В предыдущий раз я переводил краткую теорию цвета и описание управления цветом для формата PNG. Если пересказывать своими словами, то цветовые модели делятся на физические (XYZ) и логические (RGB или YUV). В форматах хранения изображений и видео используются логические форматы (потому что они ограничены в диапазоне значений), иногда с добавлением метаданных, описывающих правила конвертации из логической модели в физическую. В то время, как логическая модель обычно хранит значения в диапазоне от 0 до 255 или от 0 до 1, физическая модель оперирует комбинацией трех чисел, каждое из которых представляет взвешенную сумму энергий излучения по всему спектру видимого цвета, взятую с разными весами.
Что касается дисплеев, для них производитель указывает характеристики, описывающие то, как цифровой сигнал из, например, RGB преобразуется в значения XYZ, излучаемые этими самыми дисплеями. Такими характеристиками является точка белого (т.е. какому физическому цвету соответствует RGB-сигнал с компонентами max/max/max), основные цвета (максимумы RGB при остальных минимумах), гамма или передаточная функция, а также охват (gamut), который описывает всё множество физических цветов, которые в принципе может отобразить дисплей.
Затухание
Еще один момент, который будет иным при использовании гамма-коррекции — затухание освещения. В реальном физическом мире освещение затухает почти обратно пропорционально квадрату расстояния от источника света. На человеческом языке это означает, что сила света уменьшается при удалении от источника света, как показано ниже:
Однако при использовании этого уравнения эффект затухания слишком силен, и световое пятно получает небольшой радиус, что выглядит физически не слишком достоверно. Поэтому мы использовали другие уравнения для затухания (мы обсуждали это в туториале, посвященном основам освещения), которые дают больше возможностей настройки, или вообще линейный вариант:
Без гамма-коррекции линейный вариант дает гораздо более правдоподобные результаты, чем квадратичный, но когда мы включаем гамма-коррекцию, линейное затухание выглядит слишком слабым, и физически верное квадратичное неожиданно дает лучшие результаты. На рисунке ниже показаны различия между вариантами:
Причиной этого различия является то, что функции затухания света меняет яркость, и поскольку мы отображали нашу сцену не в линейном пространстве, мы выбрали функцию затухания, которая выглядела лучше всего на нашем мониторе, хоть и не была физически правильной. Когда мы использовали квадратичную функцию затухания без гамма-коррекции, фактически она превращалась в при отображении на мониторе, что давало гораздо больший эффект затухания. Это также объясняет, почему линейный вариант дает лучшие результаты без гамма-коррекции, ведь при нем = , что намного больше напоминает физически правильную зависимость.
Более продвинутая функция затухания, которую мы обсуждали в основах освещения, по-прежнему полезна и в сценах с гамма-коррекцией, поскольку она дает гораздо больший контроль для более точной реализации затухания (но, конечно, требует других параметров при использовании гамма-коррекции).
Я написал простую демо сцену, исходный код которой вы можете найти здесь. Нажимая клавишу пробел, вы можете переключаться между сценами с гамма-коррекцией и без, каждая из которых использует свои текстуры и функции затухания. Это не самая впечатляющая демонстрация, но она показывает, как применять данные техники.
Подведем итоги: гамма-коррекция позволяет вам работать с цветами в линейном пространстве. Поскольку физическому миру присуще линейное пространство, большинство физических вычислений будут давать лучшие результаты, например расчет затухания света. Использование гамма-коррекции позволяет гораздо легче достигать реалистичных результатов по мере усложнения применяемых техник освещения. Именно поэтому рекомендуется сразу же настроить параметры освещения для работы с гамма-коррекцией.
Сегодня мы решили рассказать о том, что умеют приложения-читалки для Android: от «слежки» за персонажами книги до адаптивной верстки и других функциональных возможностей.
Всех, кому интересна эта тема, приглашаем под кат.
Наш обзор ONYX BOOX MAX Carta: бескомпромиссность в формате А4
Метаданные H.264
На этот раз не станем долго листать стандарт, а воспользуемся программой MediaInfo (практика - наше всё).
По отредактированному выводу программы можно понять следующее:
Color space" YUV нам говорит, что в каналах изображения хранятся яркость и UV-компоненты цветности
Chroma subsampling: 4:2:0 утверждает, что на каждый пиксель U или V приходится по 4 пикселя Y
Scan type: Progressive соответствует хранению полного кадра - безо всякой черезстрочной развертки из древних телеков
Color range: Limited ограничивает задействованные значения диапазоном 16-235.
Вот это всё пока что описывает формат хранения логических цветов, без привязки к физической цветовой модели.
«Проследят» за персонажами
Для тех же, у кого нет «личного консультанта», способного ответить на все вопросы, есть специальные приложения-ридеры, которые следят за всеми «хитросплетениями». Пример — функция X-ray в Kindle, которая позволяет вспомнить, кто этот персонаж, что это за предмет и почему он важен. При вызове функции, информация о персонаже и местах в книге, где он упоминается, отображается прямо на экране ридера.
Дополнительно отметим, что этой же цели могут служить функции закладок и глобального поиска по тексту, которые предлагает, например, Aldiko Book Reader. С их помощью вы сможете находить упоминания важных для сюжета событий, персонажей и предметов и делать отметки «на полях», чтобы в случае чего к ним можно было вернуться и вспомнить, кто кому родственник, и откуда взялся этот гном.
Сноски на странице
Некоторые модели ридеров при чтении книги в формате FB2 позволяют выводить сноски к тексту внизу текущей страницы. Это очень удобно и максимально приближает чтение электронного варианта книги к бумажному. В других моделях ридеров приходится прокручивать текст книги до конца, читать содержание сноски, а затем возвращаться к той странице, на которой находилась сноска. Часть моделей электронных книг вообще не показывает сносок. Как та или иная модель устройств для чтения обрабатывает сноски можно посмотреть в сводной таблице параметров.
Если в электронной книге для чтения используется программа Cool Reader , то она обязательно будет показывать сонски внизу страницы.
Если вы прочитали про переносы в тексте и сноски внизу страницы, пожалуйста, примите участие в нашем опросе. Это поможет нам узнать Ваше мнение, а также поможет нашим читателям выбрать электронную книгу.
Итак, мы вычислили цвета всех пикселей сцены, самое время отобразить их на мониторе. На заре цифровой обработки изображений большинство мониторов имели электронно-лучевые трубки (ЭЛТ). Этот тип мониторов имел физическую особенность: повышение входного напряжение в два раза не означало двукратного увеличения яркости. Зависимость между входным напряжением и яркостью выражалась степенной функцией, с показателем примерно 2.2, также известным как гамма монитора.
Часть 1. Начало
Часть 2. Базовое освещение
Часть 3. Загрузка 3D-моделей
Часть 4. Продвинутые возможности OpenGL
Часть 5. Продвинутое освещение
Часть 6. PBR
Эта особенность мониторов (по случайному совпадению) очень напоминает то, как люди воспринимают яркость: с подобной же (но обратной) степенной зависимостью. Чтобы лучше это понять, взгляните на следующее изображение:
Верхняя строка показывает как воспринимается яркость человеческим глазом: при увеличении яркости в 2 раза (например, от 0.1 до 0.2) картинка действительно выглядит так, будто она в два раза ярче: изменения видны довольно отчетливо. Однако, когда мы говорим о физической яркости света, как, например, о количестве фотонов, выходящих из источника света, верную картину дает нижняя шкала. На ней удвоение значения дает правильную с физической точки зрения яркость, но поскольку наши глаза более восприимчивы к изменениям темных цветов, это кажется несколько странным.
Поскольку для человеческого глаза более привычен верхний вариант, мониторы и по сей день используют степенную зависимость при выводе цветов, так что исходные, в физическом смысле, значения яркости преобразуются в нелинейные значения яркости, изображенные на верхней шкале. В основном это сделано потому, что так выглядит лучше.
Эта особенность мониторов действительно делает картинку лучше для наших глаз, но когда дело доходит до рендеринга графики появляется одна проблема: все параметры цвета и яркости, которые мы устанавливаем в наших приложениях, основаны на том, что мы видим на мониторе. А это означает что все эти параметры на самом деле являются нелинейными. Взгляните на график:
Серая линия соответствует значениям цвета в линейном пространстве; сплошная красная линия представляет собой цветовое пространство отображаемое монитором. Когда мы хотим получить в 2 раза более яркий цвет в линейном пространстве, мы просто берем и удваиваем его значение. Например, возьмем цветовой вектор , то есть темно-красный цвет. Если бы мы удвоили его значение в линейном пространстве, он стал бы равным . С другой стороны, при выводе на дисплей, он будет преобразован в цветовое пространство монитора как , как видно из графика. Вот здесь и возникает проблема: удваивая темно-красный свет в линейном пространстве, мы фактически делаем его более чем в 4.5 раза ярче на мониторе!
До этого туториала мы предполагали, что работали в линейном пространстве, но на самом деле мы работали в цветовом пространстве, определяемом монитором, поэтому все установленные нами цвета и переменные освещения были физически не корректны, а всего лишь выглядели правильными конкретно на нашем мониторе. Руководствуясь данным предположением мы (и художники) обычно устанавливаем значения освещения ярче, чем они должны быть (т.к. монитор затемняет их), что в результате делает большинство последующих вычислений в линейном пространстве неверными. Также обратите внимание, что оба графика начинаются и заканчиваются в одних и тех же точках, затемнению на дисплее подвержены только промежуточные цвета.
Как я уже говорил, поскольку значения цветов выбраны на основании отображаемой монитором картинки, все промежуточные вычисления освещения, проводимые в линейном пространстве физически некорректны. Это становится все очевиднее, когда мы начинаем использовать более продвинутые алгоритмы освещения. Просто взгляните на изображение:
Как видно, цветовые значения (которые мы предварительно обновили) с использованием гамма-коррекции куда лучше сочетаются между собой, а темные области становятся светлее, что увеличивает их детализацию. Налицо гораздо лучшее качество изображения, при весьма незначительных модификациях.
Без должным образом настроенной гаммы монитора освещение выглядит неправильно, и художникам будет довольно трудно получить реалистичные и красивые результаты. Чтобы решить эту проблему необходимо применять гамма-коррекцию.
Гамма-коррекция
Идея гамма-коррекции заключается в том, чтобы применить инверсию гаммы монитора к окончательному цвету перед выводом на монитор. Снова посмотрим на график гамма-кривой в начале этого урока, обратив внимание на еще одну линию, обозначенную штрихами, которая является обратной для гамма-кривой монитора. Мы умножаем выводимые значения цветов в линейном пространстве на эту обратную гамма-кривую ( делаем их ярче), и как только они будут выведены на монитор, к ним применится гамма-кривая монитора, и результирующие цвета снова станут линейными. По сути мы делаем промежуточные цвета ярче, чтобы сбалансировать их затенение монитором.
Приведем еще один пример. Допустим, у нас опять есть темно-красный цвет . Перед отображением этого цвета на монитор мы сперва применяем кривую гамма-коррекции к его компонентам. Значения цвета в линейном пространстве, при отображении на мониторе, возводятся в степень, приблизительно равную 2.2, поэтому инверсия требует от нас возведения значений в степень 1 / 2.2. Таким образом, темно-красный цвет с гамма-коррекцией становится = = . Затем этот скорректированные цвет выводится на монитор, и в результате он отображается как = . Как видите, когда мы используем гамма-коррекцию монитор отображает цвета, точно такими, какими мы задаем их в линейном пространстве в нашем приложении.
Гамма равная 2.2 это дефолтное значение, которое приблизительно выражает среднюю гамму большинства дисплеев. Цветовое пространство в результате применения этой гаммы называется цветовым пространством sRGB. Каждый монитор имеет свои собственные гамма-кривые, но значение 2.2 дает хорошие результаты на большинстве мониторов. Из-за этих небольших отличий многие игры позволяют игрокам изменять настройку гаммы.
Существует два способа применения гамма-коррекции к вашим сценам:
- Использовать встроенную в OpenGL поддержку sRGB для кадрового буфера.
- Выполнять гамма-коррекцию вручную, в фрагментных шейдерах.
Первый вариант проще, но дает вам меньше контроля. Установив флаг GL_FRAMEBUFFER_SRGB, вы сообщаете OpenGL, что каждая следующая за этим команда рисования должна выполнить гамма-коррекцию в цветовое пространство sRGB, прежде чем записать данные в цветовой буфер. После включения GL_FRAMEBUFFER_SRGB OpenGL автоматически выполнит гамма-коррекцию после запуска каждого фрагментного шейдера для всех последующих кадровых буферов, включая дефолтный кадровый буфер.
Включение флага GL_FRAMEBUFFER_SRGB выполняется при помощи обычного вызова glEnable:
Теперь отрендеренные вами буферы цвета будут иметь скорректированную гамму и, поскольку это делается аппаратно это ничего нам не стоит. Единственное, о чем вы должны помнить при таком подходе (хотя и при другом подходе тоже), что гамма-коррекция преобразует цвета из линейного пространства в нелинейное, поэтому очень важно, чтобы вы выполняли гамма-коррекцию только на последнем, заключительном этапе. Если вы примените гамма-коррекцию до окончательного вывода, все последующие операции над этими цветами будут работать с неправильными значениями. Например, если вы используете несколько кадровых буферов, вы, вероятно, хотите, чтобы промежуточные результаты оставались в линейном пространстве и только последний буфер применял гамма-коррекцию перед отправкой на монитор.
Второй подход требует немного больше работы, но зато дает нам полный контроль над операциями с гаммой. Мы применяем гамма-коррекцию на соответствующем этапе фрагментного шейдера, так что к результирующим цветам применяется гамма-коррекция непосредственно перед отправкой на монитор:
Последняя строка кода возводит каждый компонент цвета fragColor в степень , корректируя результат работы данного шейдера.
Проблема этого подхода заключается в том, что вы должны применять гамма-коррекцию для каждого фрагментного шейдера, который вносит свой вклад в окончательный вывод, поэтому, если у вас есть дюжина фрагментных шейдеров для нескольких объектов, вам придется добавить код гамма-коррекции в каждый из них. Более разумным решением было бы добавить этап пост-обработки в ваш цикл рендеринга и применять гамма-коррекцию на финальном кваде в качестве последнего шага. Тогда вам нужно будет сделать это всего один раз.
Собственно, эти 2 строчки кода и представляют собой технические реализации гамма-коррекции. Не слишком впечатляет, правда? Подождите, есть еще пара нюансов, которые вы должны учитывать при гамма-коррекции.
Гамма-коррекция
Гамма коррекция шрифта - это введение специального коэффициента, влияющего на контрастность прорисовки символов. Чем выше этот коэффициент, тем контрастнее изображение, черный цвет чернее, белый - белее, полутонов меньше. Если поставить слишком высокое значение буквы приобретают неровные края, эффект от функции сглаживания теряется. Чем меньше коэффициент, тем мягче и плавнее прорисовка символов на экране, больше полутонов.
Адаптируют оформление
Бумажная литература, какой бы популярной она ни была и какими бесспорными достоинствами ни обладала, имеет один недостаток — шрифт, оформление абзацев и другие параметры страницы нельзя настраивать — за них «отвечает» типография. И иногда издатели принимают довольно необычные решения в оформлении. Например, «Ведьмак» Анджея Сапковского от московского издательства «Астрель» имеет довольно необычную разметку страницы — из-за размеров книги текст разбит на две колонки, что нравится далеко не всем.
Электронные книги и приложения для их чтения предлагают большое количество инструментов для кастомизации представления текста. Например, MOON Reader позволяет настраивать все: шрифты, темы, оверлеи. Приложение автоматически сканирует устройство на наличие шрифтов и подгружает их — можно выбрать нужный и указать его размер, свойства, «подогнать выравнивание» и цвет. При этом MOON Reader автоматически подстраивает текст под размеры экрана, «обрезая» ненужные пробелы и редактируя отступы между параграфами.
Как только вы открываете первую книгу, MOON Reader предлагает настроить тап-зоны (области, отвечающие за перелистывание и вызов меню) и шаблоны для жестов. Большое количество опций по настройке тап-зон дает и Orion Viewer. «Рабочая поверхность» устройства разделяется на 9 областей, на каждую из которых можно назначить любое действие: перейти в начало или конец книги, пролистать десять страниц вперед, открыть содержание, повернуть экран, обрезать поля и др. Это лишь часть его возможностей.
Настраивать большое количество тап-зон и жестов позволяет еще одно приложение — NEO reader 2.0, которое идет предустановленным по умолчанию на все ридеры ONYX BOOX. Оно адаптировано для работы с форматами PDF и DjVu (в целом поддерживаются все популярные форматы) и предоставляет множество опций по масштабированию и обрезке полей (при желании их можно настроить с точностью до пикселя).
Например, есть возможность выбрать конкретный участок для масштабирования, прочитать увеличенную страницу по фрагментам, обрезать по странице и по ширине, изменить масштаб. Если вы читаете техническую литературу, то для графиков и схем можно «подкрутить» контрастность, чтобы лучше разглядеть значения на шкалах и подписанные величины.
Специальная функция Reflow упрощает работу с отсканированными PDF-документами и дает возможность настраивать размер шрифта, межстрочный интервал, параметры столбцов. Для работы с текстом в ридере ONYX BOOX предустановлено большое количество шрифтов, при этом он может работать с буквицами и висячей пунктуацией, имеет отключаемые переносы и настраиваемую пагинацию. Также есть гамма-коррекция и встроенные стили.
Некоторые приложения, например, AlReader (а также OReader, который является адаптацией AlReader и используется в читалках ONYX BOOX), позволяют настраивать отображаемые элементы для каждого режима экрана (оконный полноэкранный): системную строку, колонтитул, строку состояния. Для последней можно отдельно задать необходимые элементы: страницы, проценты, время, заряд аккумулятора, информацию о книге, линию прогресса.
В целом программы для чтения электронных книг за последние годы расширили функциональность — популярные приложения сегодня предоставляют не только инструменты для синхронизации с библиотеками и кастомизации отображения текста, но и возможности для корректировки опечаток и внесения исправлений. Все это призвано сделать чтение с помощью ридеров еще более комфортным.
P.S. Приложения для читалок ONYX BOOX на Android (и Linux) вы можете найти на нашем сайте.
Отображение на дисплее
Допустим, мы передаем логическое RGB-значение цвета S на дисплей. Тот что-то мутит с напряжениями, транзисторами и прочей электроникой, в результате чего испускает фотоны, воспроизводящие цвет D . Вот это электронное "что-то" производитель дисплея описывает в характеристиках как преобразование D = Fd(S) .
Мы же в свою очередь имеем логическое значение V , декодированное из видеофайла, но (пока что) понятия не имеем, какой физический цвет имел ввиду автор данного видео. Если мы просто отправим на дисплей V вместо S , то увидим "сферического коня в вакууме".
Однако, чтобы наш золотой видеофильский кабель не зря пылился под столом, нам очень хочется, чтобы цвет D на дисплее соответствовал физическому цвету C видеокамеры, на которую снято данное видео. Поэтому нам надо построить функцию преобразования для дисплея: S = Fs(V) . Тут нам поможет последнее оставшееся незадействованным поле метаданных Color primaries .
Тонкие черные линии и мелкие детали воспринимаются человеческим глазом как серые. Шрифт, расположенный на изображении слева, выглядит менее ярко, чем шрифт, изображенный справа. К сожалению, не все производители электронных книг снабжают свое устройство яркими, хорошо читаемыми шрифтами.
Для тех электронных книг, которые поддерживают функцию загрузки дополнительных шрифтов формата TTF (True Tupe Fonts), мы создали специальный набор из восьми различных шрифтов утолщенного начертания. В этом наборе пропорционально на 25% утолщены все четыре начертания каждого из шрифтов - обычный, жирный, курсив, жирный курсив.
Чтобы возпользоваться таким набором, Вам нужно скачать архив с этого сайта и распаковать его в определенную папку на SD-карте или во внутренней памяти ридера. Точное название папки и ее расположение Вы можете узнать из инструкции по эксплуатации электронной книги.
Приведем несколько примеров расположения папки со шрифтами в электронных книгах.
Бренд, модель | Расположение папки со шрифтами | Носитель |
Pocketbook все модели | /system/fonts | Внутренняя память |
Lbook v3+, v5 | /fonts | SD-карта |
Onyx boox все модели | /Fonts | SD-карта |
Gmini magicbook Z6, R6L, C6HD, C6LHD | /fonts | Внутренняя память |
Kobo | /fonts | Внутренняя память |
Bookeen Cybook Muse Essential, Bookeen Cybook Muse Frontlight* | /Fonts/Имя шрифта | Внутренняя память |
Digma e605, E627, E629, E630, E631, R656, R657, S676, T646, e64m | /fonts | Внутренняя память |
Модели с ОС Android с программой Coolreader (Nook Simple Touch - Rooted, Sony PRS T1, T2 - Rooted, Wexler E6005, E6007) | /fonts | SD-карта |
*Для Bookeen Cybook Muse Essential, Bookeen Cybook Muse Frontlight во внутренней памяти в существующей папке /Fonts необходимо создать папку, совпадающую по названию с названием шрифта (например "/Fonts/Verdana") и в нее положить 4 файла шрифта TTF с разными начертаниями.
К сожалению, пока не существует единого стандарта кодировки для отображения старорусских букв, поэтому при чтении книг, содержащих старославянские символы, возможны ошибки или некорректное отображение некоторых текстов на экране ридера. В этом случае придется либо подбирать нужный шрифт, либо воспользоваться книгами в формате EPUB со встроенными в файл книги шрифтами.
При чтении текстовой книги (если это не формат DJVU или PDF) Вы можете отрегулировать размер шрифта и его вид (начертание). При этом одни виды шрифта будут удобно и легко читаться, другие - наоборот.
Для длительного комфортного чтения книг прежде всего необходим яркий, красивый, хорошо воспринимаемый шрифт. Одним из свойств человеческого зрения является плохое восприятие цвета мелких или тонких деталей. Поэтому визуально тонкие шрифты воспринимаются более серыми, чем жирные. В каждой электронной книге изначально присутствует набор из нескольких шрифтов, чтобы пользователь мог выбрать тот, который ему больше подходит. Обычно в такой набор входит шрифт без засечек семейства Arial и шрифт с засечками семейства Times.
В некоторых моделях электронных книг есть возможность загрузки пользовательских шрифтов формата TTF. Это очень удобно. Вы можете подобрать такие шрифты, которые Вам больше всего понравятся и прямо из папки Windows/fonts (или из интернета) скопировать их в ридер. Можно скачать специальный набор шрифтов и с нашего сайта.
Гамма, или передаточная функция
Согласно википедии, гамма-коррекция - это процесс нелинейного преобразования значений сигнала с целью лучшей передачи темных полутонов. На пальцах можно объяснить так: пусть есть сигнал в диапазоне от 0 до 255. Яркость точки 2 отличается от яркости точки 1 в 2 раза, а яркость 255 от 254 - в "нисколько" раз, глаз не различит. Поэтому близкие темные полутона такой сигнал передать физически не может. Теперь договоримся, что будем рассчитывать значение яркости как 2^C , где C как раз в диапазоне от 0 до 255. Тогда в примере выше обе пары точек будут соответствовать изменению яркости в 2 раза. Ура, теперь мы одинаково точно передаем и светлые, и темные полутона. Правда, человеческий глаз устроен немного иначе, и классическая формула выглядит как A * C ^ 2.2 , где 2.2 - это значение гаммы.
Конечно, вся эта теория уже мхом обросла, и современная версия стандарта H.264 описывает аж целых 10 функций преобразования (Таблица E4 - Transfer characteristics [1]), их которых только 2 соответствуют значению гаммы 2.2 и 2.8. Но в любом случае, передаточная функция - это очень важная часть стандарта, и ошибка ее использования при отображении цвета приведет к очень заметным искажениям.
В модели YUV за яркость отвечает Y - взвешенная сумма компонентов RGB. U и V соответствуют разностям яркости и синего/красного каналов. За счет того, что человеческий глаз гораздо лучше отличает яркость, нежели оттенок цвета (ну, помните, из школы, бульбочки и колбочки), становится возможным экономить биты при работе в YUV-модели: в пиксельном формате yuv420 блок 2х2 пикселя кодируется четырьмя значениями яркости Y и лишь двумя значениями цветности (по одному для U и V) - экономия! Тот же блок 2х2 в yuv422 соответствует четырем значениям яркости и по двум значениям UV (блоки 2х1 по горизонтали). Больше форматов веселых и разных описаны в вики к плееру VLC, а нам достаточно того, что yuv420p встречается чаще всего в видеопотоке H.264.
Есть еще один момент: во всей этой математике преобразований, особенно реализованной на целочисленной арифметике, есть побочка в виде ошибок округления: например, формула floor(1.1*x) будет давать идентичные значения для 254 и 255, так что для перестраховки используется не полный диапазон значений байта, а, например, от 16 до 235 [2] - глядишь, до границы не дойдет. Страдает количество передаваемых цветов, зато арифметика проще. Это потихоньку уходит в прошлое, потому что, например, стандарт JPEG использует весь диапазон от 0 до 255 и называет этот формат J420.
Функция сглаживания шрифтов
Программное обеспечение определенной модели электронной книги может иметь или не иметь функцию сглаживания шрифтов. Если функции сглаживания нет (или она отключена), то каждая буква прорисовывается на экране черным цветом по белому без полутонов. При этом прямые горизонтальные и вертикальные линии каждой буквы выглядят четко и красиво, а изогнутые и наклонные линии букв прорисованы "лесенкой".
Если же функция сглаживания шрифта есть и включена, то изогнутые и наклонные края букв прорисовываются полутонами и от этого становятся ровнее. Визуально буквы становятся красивее и текст лучше воспринимается. Эта функция отнимает ресурсы у микропроцессора электронной книги и текст с включенным сглаживанием выводится на экран чуть-чуть медленнее, но для глаза такая задержка практически не заметна.
Кернинг шрифта
Кернинг - это изменение расстояния между некоторыми парами символов для улучшения зрительного восприятия шрифта. Этот параметр подразумевает индивидуальную работу с каждой парой букв и подбор их взаиморасположения в зависимости от выбранного шрифта. При включенной функции кернинга некоторые пары символов (как, например, W-A, A-V, У-Д в верхней строке рисунка) приближаются друг к другу. Расстояния между контурами таких букв в слове становятся меньше других, но визуально это воспринимается более гармонично, чем равные расстояния между символами (нижняя строка на рисунке).
Расширят вашу библиотеку
Пожалуй, многие из нас сталкивались с ситуацией, когда не удавалось найти нужную книгу или заполучить произведение на языке оригинала. Иногда книги нет в магазинах, поскольку издательство прекратило её выпускать — так было с «Росмэном» и циклом произведений про Гарри Поттера. Права на выпуск книг перешли «Махаону», и теперь в книжных можно найти только их версию.
Приложения-читалки позволяют покупать и скачивать книги напрямую из библиотек. Все знают про Kindle и его интеграцию с магазином Amazon, однако на рынке есть и другие приложения, о которых стоит рассказать в этом обзоре.
Например, приложение CoolReader дает пользователям прямой доступ к The Gutenberg Project для скачивания популярных книг. Проект «Гутенберг» занимается оцифровкой и сохранением в текстовом формате различных произведений мировой литературы. В 2005 году количество книг, собранных в рамках инициативы, составляло 17 тыс. На сегодняшний день для бесплатной загрузки доступно уже более 56 тыс. документов.
Литература из The Gutenberg Project даже используются для «продвижения» других инициатив, например Standard Ebooks. Участники Standard Ebooks берут книги из открытых источников, в том числе OPDS-каталогов, форматируют и корректируют их, согласно разработанному руководству. Они добавляют обложки с изображениями, правят сноски и цитаты так, чтобы книга не выглядела как обыкновенный текстовый документ.
Приложение CoolReader работает и с магазином «ЛитРес», ассортимент которого насчитывает порядка 750 тыс. электронных книг (из них 100 тыс. русскоязычных). Доступ к The Gutenberg Project и «ЛитРес» также дает приложение FBReader. Однако для взаимодействия с ними оно предлагает дополнительные функции. FBReader для Android дает писать и добавлять плагины, расширяющие его функциональность. В случае с «ЛитРес», приложение позволяет оплачивать книги с помощью SMS. При этом FBReader может организовать так называемую книжную сеть, когда вся библиотека хранится в облачном хранилище, а книги объединяются по авторам и сериям.
Кроме того, приложения-читалки могут упростить работу с иностранной литературой благодаря встроенным словарям. С их помощью можно просмотреть значение или перевод слова в одном окне. Например, в ONYX BOOX представлены англо-русский и русско-английский словари с возможностью добавления словарных баз формата StarDict. Для просмотра перевода слова достаточно выделить его в тексте.
Список библиотек, к которым открывают доступ ридеры, не ограничивается обыкновенной литературой. Есть приложения, которые дают скачивать и просматривать комиксы на экране мобильного устройства. Примером может служить Comics от Comixology, которое включает в себя более 100 тыс. комиксов различных изданий — Marvel, DC Comics, Image Comics, Disney и других.
В 2016 году сервис даже запустил подписку «в стиле Netflix» — Comixology Unlimited, позволяющую читать неограниченное количество комиксов. Как отметили в Forbes, подобная услуга оказывается полезна как для тех, кто только начинает знакомство с этим жанром, так и для тех, кто ищет новые тайтлы.
Еще один пример приложения для чтения комиксов — Marvel Unlimited. Оно имеет элементы дополненной реальности, которые дают возможность глубже погрузиться во вселенную Marvel. На страницах комиксов установлены специальные метки, которые можно просканировать и почитать комментарии художников, сценаристов, увидеть интервью с создателями.
Пока такие приложения далеко не всегда подходят для чтения с электронных ридеров, однако в скором времени ситуация изменится. Редакторы блога Good e-Reader отмечают, что уже в 2018 году на рынке могут начать продаваться читалки с дисплеями высокого разрешения на базе цветных электронных чернил. Пока неизвестно, появятся ли ридеры с цветным E Ink дисплеем диагональю 13,3 дюйма (для примера, дисплей такого размера установлен на ONYX BOOX MAX 2), но если это случится, то такие гаджеты, вероятно, смогут стать полноценной платформой для чтения графических новелл.
Поддержка переносов текста
Не все модели электронных книг имеют функцию поддержки переносов слов по правилам русского языка. При наличии такой функции текст распределяется по экрану равномерно, длинные слова, не помещающиеся на строке, разбиваются переносом на две части. При отсутствии функции поддержки переносов текст на экране содержит непропорционально большие пустоты. Читать такой текст конечно можно, но для глаза это не очень приятно.
Прочитают книгу «вслух»
Бывают ситуации, когда читать книгу неудобно — заняты руки, или не позволяет состояние здоровья. Другой пример — вы находитесь за рулем и вам хочется продолжить знакомство с книгой, но уже в аудиоформате. Эту задачу решают аудиокниги. По статистике, которую приводит Audio Publishers Association, транспорт является вторым по популярности местом (после дома) их прослушивания.
Часть приложений-читалок поддерживает технологию TTS (text-to-speech), благодаря которой они умеют синтезировать речь. Тот же FBReader имеет специальный модуль от компании Hyperionics Technology, позволяющий воспроизводить текст книги «вслух». FBReader поддерживает и аудиокниги: поэтому если произведение есть в аудиоформате, то можно слушать предварительно записанную речь, а не синтезированную.
«Работать со звуком» также может tolino — приложение открывает доступ к целой библиотеке с аудиокнигами. При этом оно синхронизирует все ваши книги между несколькими устройствами с сохранением прогресса — вы можете начать «читать» с экрана монитора, а продолжить уже на смартфоне или ридере.
Декодирование битового формата
Дальше мы попробуем мысленно декодировать данные, хранящиеся в видеопотоке. Этап с декодером мы пропустим, потому что сжатие видео - это про другое. Нашими входными данными будут кадры, для которых на каждые 2х2 пикселя в наличии имеются: 4 байта яркости, 1 байт U-компоненты и 1 байт V-компоненты.
Избавляемся от 4:2:0 : 1 байт UV-компонент используем для всех четырех пикселей. Теперь у нас на каждый пиксель приходится по 3 байта YUV-компонент.
Приводим значения из диапазона 16-235 к диапазону 0-1: так мы избавились от Limited , а компоненты теперь лежат в нормированном диапазоне.
Коррекция тональности
Дальше по классике: чтобы аккуратно передавать светлые и темные полутона, используем передаточную функцию из Таблицы E-4 - Transfer characteristics [1] на каждом из трех каналов:
формула коррекции тональности для BT.709-5
Заметьте, мы всё еще не знаем, какие физические цвета обрабатываем: пока мы просто занимались преобразованием логических значений.
Перевод в RGB
На данном этапе нам необходимо трех-компонентный вектор YUV привести к трех-компонентному вектору RGB. Формулировки знакомы? Первый курс, линейная алгебра, умножение матрицы на вектор. Поле Matrix coefficients подсказывет нам, что надо использовать формулу из Таблицы E-5 - Matrix coefficients [1], указанную ниже:
Эти коэффициенты упомянуты в википедии и используются в формуле получения Y-компоненты из RGB:
Пристально взглянув на эту и остальные формулы, замечаем, что это линейное преобразование, которое описывается матрицей 3х3.
Вычисляем обратную матрицу (ага, для каждого пикселя в видео - конечно же нет, просто хардкодим ее в исходниках).
умножаем YUV на обратную матрицу M[-1] , получаем RGB.
Нормируем, как указано в той же статье вики, получаем RGB, где каждая компонента лежит в диапазоне от 0 до 1.
Хинтинг шрифта
Хинтинг - это изменение контура шрифта таким образом, чтобы он отображался более четко на устройствах с низким разрешением экрана, а также в случае применения мелкого шрифта. При включенном режиме хитинга оптимизируется разбиение контура каждой буквы на отдельные пикселы, символы становятся более четкими.
sRGB текстуры
Всякий раз, когда вы рисуете или редактируете изображение на своем компьютере, вы выбираете цвета на основе того, что видите на мониторе. Фактически, это означает, что все созданные или редактируемые вами изображения находятся не в линейном пространстве, а в пространстве sRGB, то есть удвоение темно-красного цвета на экране, основанное на воспринимаемой вами яркости, на деле не равно удвоению красной составляющей цвета.
В результате, художники, рисующие текстуры, создают их в пространстве sRGB, и если мы используем эти текстуры в нашем приложении как они есть, мы должны учитывать это. До того как мы применили гамма-коррекцию это не создавало проблем, поскольку текстуры выглядели хорошо в пространстве sRGB, и без гамма-коррекции мы также работали в этом пространстве, так что текстуры отображались именно так, как задумано. Однако теперь, когда мы отображаем все в линейном пространстве, цвета текстуры передаются неверно, как видно на следующем изображении:
Текстура пересвечена, и это происходит потому, что гамма-коррекция, фактически, была применена к ней дважды! Посудите сами: когда мы создаем изображение на основе того, что видим на мониторе, мы корректируем гамму цветовых значений изображения, чтобы они выглядели верно на экране. Поскольку мы снова выполняем гамма-коррекцию при рендере, изображения становятся слишком яркими.
Чтобы решить эту проблему, мы должны убедиться, что художники, рисующие текстуры, работают в линейном пространстве. Однако, поскольку большинство художников даже не знают, что такое гамма-коррекция, и им проще работать в пространстве sRGB, это, скорее всего, не вариант.
Еще одно решение состоит в том, чтобы скорректировать или преобразовать эти sRGB-текстуры обратно в линейное пространство, прежде чем делать какие-либо манипуляции над их цветами. Мы можем сделать это следующим образом:
Тем не менее проделывать это для каждой текстуры в пространстве sRGB довольно хлопотно. К счастью, OpenGL дает нам еще одно решение наших проблем, предоставляя нам внутренние форматы текстур GL_SRGB и GL_SRGB_ALPHA.
Если мы создадим текстуру в OpenGL с любым из указанных двух текстурных форматов sRGB, OpenGL автоматически преобразует их цвета в линейное пространство, как только мы их используем, что позволит нам правильно работать в линейном пространстве со всеми извлеченными из текстуры значениями цвета. Мы можем объявить текстуру как sRGB следующим образом:
Если вы хотите использовать альфа-компонент в своей текстуре, вам нужно будет обозначить внутренний формат текстуры как GL_SRGB_ALPHA.
Вы должны быть осторожны при объявлении своих текстур как sRGB, поскольку не все текстуры будут находиться в пространстве sRGB. Текстуры, используемые для окраски объектов, такие как диффузные карты, почти всегда находятся в пространстве sRGB. Текстуры, используемые для извлечения параметров освещения, такие как бликовые карты и карты нормалей, наоборот, почти всегда находятся в линейном пространстве, поэтому, если вы объявите их как sRGB, освещение поедет. Будьте внимательны, при указании типов текстур.
Объявив наши диффузные текстуры как sRGB, вы снова получите ожидаемый результат, но на этот раз гамма-коррекцию достаточно применить всего 1 раз.
Гамма, или передаточная функция
Согласно википедии, гамма-коррекция - это процесс нелинейного преобразования значений сигнала с целью лучшей передачи темных полутонов. На пальцах можно объяснить так: пусть есть сигнал в диапазоне от 0 до 255. Яркость точки 2 отличается от яркости точки 1 в 2 раза, а яркость 255 от 254 - в "нисколько" раз, глаз не различит. Поэтому близкие темные полутона такой сигнал передать физически не может. Теперь договоримся, что будем рассчитывать значение яркости как 2^C , где C как раз в диапазоне от 0 до 255. Тогда в примере выше обе пары точек будут соответствовать изменению яркости в 2 раза. Ура, теперь мы одинаково точно передаем и светлые, и темные полутона. Правда, человеческий глаз устроен немного иначе, и классическая формула выглядит как A * C ^ 2.2 , где 2.2 - это значение гаммы.
Конечно, вся эта теория уже мхом обросла, и современная версия стандарта H.264 описывает аж целых 10 функций преобразования (Таблица E4 - Transfer characteristics [1]), их которых только 2 соответствуют значению гаммы 2.2 и 2.8. Но в любом случае, передаточная функция - это очень важная часть стандарта, и ошибка ее использования при отображении цвета приведет к очень заметным искажениям.
В модели YUV за яркость отвечает Y - взвешенная сумма компонентов RGB. U и V соответствуют разностям яркости и синего/красного каналов. За счет того, что человеческий глаз гораздо лучше отличает яркость, нежели оттенок цвета (ну, помните, из школы, бульбочки и колбочки), становится возможным экономить биты при работе в YUV-модели: в пиксельном формате yuv420 блок 2х2 пикселя кодируется четырьмя значениями яркости Y и лишь двумя значениями цветности (по одному для U и V) - экономия! Тот же блок 2х2 в yuv422 соответствует четырем значениям яркости и по двум значениям UV (блоки 2х1 по горизонтали). Больше форматов веселых и разных описаны в вики к плееру VLC, а нам достаточно того, что yuv420p встречается чаще всего в видеопотоке H.264.
Есть еще один момент: во всей этой математике преобразований, особенно реализованной на целочисленной арифметике, есть побочка в виде ошибок округления: например, формула floor(1.1*x) будет давать идентичные значения для 254 и 255, так что для перестраховки используется не полный диапазон значений байта, а, например, от 16 до 235 [2] - глядишь, до границы не дойдет. Страдает количество передаваемых цветов, зато арифметика проще. Это потихоньку уходит в прошлое, потому что, например, стандарт JPEG использует весь диапазон от 0 до 255 и называет этот формат J420.
Читайте также: