Вернуться к разделу "Материалы по сканированию и оцифровке бумажных книг".


Метод раскраски маски

Введение

Метод раскраски маски - это новая технология по обработке DjVu-файлов. Автор метода - Алексей Крюков.

Метод раскраски маски позволяет преобразовать 1-слойный чёрно-белый DjVu-файл в 2-слойный. При этом дополнительно можно раскрасить его маску одним (любым) моноцветом - красным, синим, зелёным и т.д. Например, можно окрасить чёрно-белый текст в DjVu-файле в синий цвет.

Метод в чём-то аналогичен методу разделённых сканов (который тоже создаёт 2-слойные DjVu-файлы).

Метод раскраски маски не является самостоятельным - а может работать только в паре с методом подклейки фона. Эти 2 метода во многом аналогичны и оба они предназначены для преобразования уже готового чёрно-белого (многостраничного) DjVu-файла (например, скаченного из Интернета).

Суть метода состоит в генерации слоя-расцветки (чанк FGbz) для чёрно-белого однослойного DjVu-файла. Для этого из слоя маски (чанк Sjbz) считывается информация о т.н. "блитах" и на её основании создаётся "с нуля" раскрашивающий блок-палетка FGbz (всегда с одним цветом - независимо от числа блитов (для простоты). Блит - это мельчайший объект маски, подлежащий расцветке, т. е. отдельный знак (буква) или его часть.

Эту работу выполняет модифицированная утилита djvumake. Алексей добавил туда новый параметр FGcolor:


" FGcolor=color -- Create a single color palette for the JB2 mask and output it into a BZZ foreground chunk".

Для примера из статьи о методе подклейки фона параметры командной строки djvumake будут выглядеть так:


djvumake 1.djvu INFO=2479,3507,300 INCL=3.djbz Sjbz=Sjbz.cnk FGcolor=black BG44=BG44.cnk

Кроме того, Алексей сделал свою версию исправления ошибки в исходном коде djvumake (см. "Подробности реализации" ниже), которая позволяет не указывать параметр INFO в случае использования параметра INCL (а не только в случаях "без INCL") - как это и должно быть в соответствии с документацией к djvumake. Поэтому можно прописать в командной строке сокращённый вариант параметров:


djvumake 1.djvu INCL=3.djbz Sjbz=Sjbz.cnk FGcolor=black BG44=BG44.cnk

Вместо значения "black" можно указать либо один из 16 предопределённых цветов (см. "Приложение" ниже), либо произвольный цвет в формате RGB.

Алексей прислал мне модифицированный исходник утилиты djvumake - который я самостоятельно скомпилировал в готовую к работе программу. Выкладываю её здесь:


Скачать
модифицированную версию djvumake (вместе с исходником) (150 КБ)


Алгоритм метода

Алгоритм работы метода выглядит так:

1. Разбираем многостраничный чёрно-белый однослойный DjVu-файл на отдельные страницы.

2. Разбираем нужную страницу DjVu-файла - получая при этом единственный чанк маски (Sjbz).

3. Создаём чанк-расцветку маски (FGbz) по методу раскраски маски.

4. Создаём чанк заднего фона (BG44) по методу подклейки фона.

5. Собираем обрабатываемую страницу из чанков FGbz, Sjbz, BG44, INCL (если есть) - получая при этом 2-х-слойный DjVu-файл (вместо прежнего 1-слойного). Чанки FGbz и Sjbz считаются одним DjVu-слоем (а не двумя), т.к. чанк FGbz - это не самостоятельный слой, который можно как-либо отобразить в просмотрщике - а лишь массив пар вида "блит - номер цвета". Чанк заднего фона BG44 при этом обязателен (задний фон может быть просто пустым белым) - иначе не получится валидный DjVu-файл.

6. Собираем разобранные страницы DjVu-файла назад в единый многостраничный DjVu-файл.

Как видно, этот агоритм здорово похож на метод подклейки фона. И в том, и в другом случае исходный однослойный DjVu-файл преобразуется в многослойный. Разница состоит в том, что в методе подклейки фона создаются 3-слойные DjVu-файлы с чанком переднего плана IW44, а в методе раскраски маски - 2-слойные DjVu-файлы с чанком расцветки маски FGbz.


Подробности реализации

Вот что мне сообщил автор метода (Алексей Крюков):

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

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

Поначалу было неясно, какую из утилит DjVuLibre следует патчить (чтобы реализовать метод раскраски маски) - djvumake, djvuextract, cjb2 или что-то еще? Но решил всё-таки начать с djvumake. Как я и полагал, всё оказалось элементарно просто. Разве что код получился не очень красивым из-за того, что для вывода FGbz нам надо сначала знать, что у нас за маска, а между тем djvumake сбрасывает каждый блок в файл сразу же по мере разбора командной строки вместо того, чтобы накапливать параметры для последующей обработки. IMHO это принципиальная ошибка, но я не ставил себе цели ее исправлять, т. к. тогда пришлось бы переписывать половину файла.

В процессе создания модифицированной версии djvumake всплыла всё та же проблема с разделенными файлами. Вот смотрите: из-за чего раньше возникал глюк? Да из-за того, что для получения габаритов страницы нужно было анализировать маску (т. е. блок Sjbz). Блоки INCL при этом не разбирались. Этот способ дает сбой на файлах со ссылками на разделенный словарь, поскольку анализатору JB2 нужны все данные, в т. ч. и те, что находятся во внешних файлах. Леон Боту это дело "исправил" так: теперь djvumake просто проигнорирует ошибку разбора маски, если только ширина и высота страницы были указаны в параметрах INFO. Но такое решение не годится: во-первых, привязываться к INFO недопустимо (в нормальной ситуации этот параметр при наличии Sjbz вообще является излишним), а во-вторых, нам теперь от анализатора JB2 кроме габаритов нужен еще один параметр, т. е. то самое число blits. В общем, мне пришлось дописать код для разбора разделенных словарей из блоков INCL, как это и следовало сделать по уму. Обратите внимание, что параметр INFO теперь указывать не обязательно.

--
Regards,
Alexey Kryukov <anagnost at yandex dot ru>

Moscow State University
Historical Faculty


Выводы

Метод раскраски маски - это совершенно новая, перспективная и революционная DjVu-технология. Она является модификацией и дополнением метода подклейки фона (модификацией - в части замены IW44 на FGbz (для маски), дополнением - в части возможности раскраски маски).

Метод раскраски маски, совокупно с методом подклейки фона, стали (теперь уже) полностью эквивалентны опции "DjVu Sepia" в программе JRA Publish 3.0 (ранее был только метод подклейки фона - без возможности изменить цвет маски (как это делает DjVu Sepia).

Достоинством метода раскраски маски являются крайне малые издержки на рост размера раскрашиваемого DjVu-файла (за счёт добавления одного лишь только чанка-палетки FGbz вместо целого слоя переднего плана IW44 - как это делает метод подклейки фона).

Алексей планирует попросить Леона Боту (одного из создателей формата DjVu) добавить исходники модифицированного djvumake в будущие версии DjVuLibre (на данный момент текущая версия - 3.5.21).


Обновление

Леон Боту (по просьбе Алексея) внес необходимые исправления в djvumake, но слегка "причесал" их в соответствии со своими предпочтениями.

Самое главное изменение в том, что он отказался от параметра FGcolor и вместо этого расширил синтаксис FGbz. Теперь, если значение этого параметра начинается со знака "решетки", то он рассматривается как спецификация цвета, с которым надо создать палитру:


"FGbz=(bzzfile|#color) -- Create a BZZ encoded foreground chunk".

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

Теперь синтаксис командной строки в нашем примере может выглядеть так:


djvumake 1.djvu INCL=3.djbz Sjbz=Sjbz.cnk FGbz=#black BG44=BG44.cnk

Алексей прислал мне скорректированный Леоном Боту исходник утилиты djvumake - который я самостоятельно скомпилировал в готовую к работе программу. Выкладываю её здесь:


Скачать
скорректированную (Леоном Боту) версию djvumake (вместе с исходником) (146 КБ)

Алексей и я выражаем признательность Леону Боту за быстрый ответ и помощь в реализации необходимой
функции.

Практически нет сомнений, что эти изменения в djvumake войдут в будущие версии DjVuLibre (после 3.5.21).


Приложение

Предопределённые 16 цветов раскраски маски (у модифицированного djvumake):

Имя

Номер

Вид

aqua 00FFFF  
black 000000  
blue 0000FF  
fuchsia FF00FF  
gray 808080  
green 008000  
lime 00FF00  
maroon 800000  
navy 000080  
olive 808000  
purple 800080  
red FF0000  
silver C0C0C0  
teal 008080  
white FFFFFF  
yellow FFFF00  

Это стандартная Web-палитра, описанная в спецификациях HTML и CSS.

Можно просто задать любое шестнадцатиричное значение цвета в формате RGB (например, #0f0f0f).


Автор: monday2000.

26 мая 2009 г.

E-Mail  (monday2000 [at] yandex.ru)

Hosted by uCoz