fddy (fddy) wrote,
fddy
fddy

  • Mood:
  • Music:

Ликбез

По просьбе nehoda и gasloff.

     Как известно, некоторые полезные и нужные книги выложены в сети в виде отдельных графических файлов, как например, по этим адресам:

     и еще во многих местах. Работать с книгами в таком виде крайне неудобно, потому как при этом необходимо иметь постоянный доступ к сети, причем может иметь место немалый расход трафика. Гораздо удобнее было бы иметь всю книгу в виде одного многостраничного документа, например в формате PDF или DjVu.

     Процесс подготовки такого документа можно разделить на три этапа:

  1. Выкачивание графических файлов из сети на локальный диск;
  2. Подготовка графических файлов к сборке;
  3. Сборка файлов в документ.

     Итак, первым делом нужно скачать нужные файлы. Это не так просто, как может показаться. Попытка простого рекурсивного выкачивания в лучшем случае приведет к скачиванию дополнительно к нужным файлам большого количества индексных страниц, элементов оформления, эскизных изображений и прочих ненужных нам вещей, а в худшем - вообще ни к чему не приведет. Например, рекурсивно скачать файлы с адреса http://civil-reprint.consultant.ru/doc.asp?ID=6 просто не получится, а выкачивать каждую картинку вручную весьма затруднительно. Однако, если обратить внимание на названия нужных файлов, то легко обнаружить очень простую закономерность. Смотрим на страницу http://civil-reprint.consultant.ru/doc.asp?ID=6&PSC=1&PT=1&Page=1 и видим, что URL первого файла:


http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006001.png

второго:

http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006002.png

и так далее. Можно предположить, что последние три символа в имени файла представляют собой его порядковый номер. То есть последний файл должен иметь URL:

http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006746.png

     На странице http://civil-reprint.consultant.ru/doc.asp?ID=6&PSC=1&PT=1&Page=746 можно убедиться, что это действительно так. Таким образом выяснилось, что файлы просто пронумерованы по порядку с некоторым префиксом.

     Чтобы скачть все нужные файлы, можно воспользоваться командным файлом:

#!/bin/bash
for i in `seq 1 746` ; do
wget http://civil-reprint.consultant.ru/images\
/3/00.png/0000.png/000006`printf "%.3d" $i`.png
done

     Программе wget в качестве параметра передается URL, представляющий собой текстовую строку, в нужное место которой подставлен вывод команды printf. Эта команда выполняет примерно то же действие, что и одноименная функция языка C, то есть выводит на стандартный вывод список аргументов в соответствии со спецификацией формата. Аргументом в нашем случае является переменная цикла i, а спецификация формата %.3d предполагает, что выводится целое число в три позиции с лидирующими нулями. Конструкция for name in word; do list; done является, строго говоря, циклом по переменной перечисляемого типа, где name - имя переменной, а word - список символов, из которого на каждом шаге цикла подставляется следующее по списку значение, после чего выполняется список команд list. В нашем случае список символов представляет собой результат работы программы seq, которая выводит на стандартный вывод список целых чисел в диапазоне, заданном двумя аргументами - минимальным и максимальным значением (в нашем случае это порядковые номера первого и последнего файлов), а выполняется на каждом шаге программа wget с соответствующим шагу параметром.

     Символ \ в конце строки означает, как известно, отмену этого самого конца строки, то есть следующая строка является строкой продолжения.

     Вот такой вот совсем простой, в общем-то, командный файл. Если кому что непонятно - man bash. Пользователи BSD, Solaris и т. п. при отсутствии bash могут, разумеется, использовать имеющийся в их системах командный процессор.

     Вышесказанное относится, однако, к пользователям нормальных операционных систем. А вот пользователям Windows вышеописанный способ скачивания недоступен, так как командный процессор Windows (CMD.EXE) имеет крайне ограниченные возможности и не пригоден для исполнения подобных вышеприведенному командных файлов. Можно использовать bash из набора утилит unix, собранных под Win32. Этим утилитам для работы не требуются CygWin или MinGW. Однако в этот набор не входит программа seq, зато в эту версию bash встроена программа проверки условий, поэтому командный файл придется переписать следующим образом:

#!/bin/bash
let n=1
while [ "$n" -le 746 ] ; do
wget http://civil-reprint.consultant.ru/images\
/3/00.png/0000.png/000006`printf "%.3d" $n`.png
let n=n+1
done

     Конструкция while list1; do list2; done означает исполнение списка программ list2 до тех пор, пока список программ list1 возвращает нулевое значение. Программа [ (да, [ - это именно название программы) проверяет, выполняется ли условие, переданное ей в качестве параметров, и возвращает соответствующее значение (параметр -le означает, что условие выполняется, если первое целое число меньше второго или равно ему, параметр ] означает конец условия). Подробнее о проверке условий - man [. Таким образом, у нас получился обычный цикл по счетчику, каковым счетчиком является переменная n.

     Cуществует также командный процессор 4NT, предназначенный для заменны штатного командного процессора Windows и обладающий гораздо большими возможностями, можно попробовать использовать его. В крайнем случае можно написать на любом доступном языке программу, подобную приведенной ниже:

       PROGRAM MKBATCH

       INTEGER*4      FIRST, COUNTER, LAST
       CHARACTER(80)  PREFIX,PREFIX2
       CHARACTER(8)   SUFFIX
       PREFIX  = 'wget http://civil-reprint.consultant.ru/images/'
       PREFIX2 = '3/00.png/0000.png/000006'
       SUFFIX  = '.png'

       FIRST  = 1
       LAST   = 746

       OPEN (UNIT=10,FILE='download.cmd',STATUS='NEW',FORM='FORMATTED')

       DO 1 COUNTER=FIRST,LAST,1
       WRITE (10,2) PREFIX,PREFIX2,COUNTER,SUFFIX
1      CONTINUE

       CLOSE (10)
       STOP

2      FORMAT (A47,A24,I3.3,A4)

       END

     После запуска такая программа создаст командный фаил следующего вида:

wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006001.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006002.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006003.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006004.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006005.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006006.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006007.png
...
(и так далее)
...
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006744.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006745.png
wget http://civil-reprint.consultant.ru/images/3/00.png/0000.png/000006746.png

каковой файл и следует запустить на исполнение. Wget для Windows можно скачать во многих местах.

     Если скачанные файлы имеют приемлемый для сборки вид (каждый файл представляет собой изображение одной страницы и не содержит какой-либо ненужной информации) можно сразу переходить к третьему этапу. Если же не так, придется произвести некоторую обработку, причем в зависимости от вида, формата и содержания исходных файлов этот этап может оказаться самым трудным.

 

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

     Все изображения можно разделить на три типа: монохромные, черно-белые и цветные. В цифровом виде каждый тип представляется немного по-разному. С монохромными изображениями все понятно - каждый пиксел представлен одним битом. Черно-белые изображения обычно представлены в восьмиразрядном виде - по байту на пиксел, то есть всего оттенков серого цвета может быть 28=256. Цветные изображения могут быть представлены в разной цветовой схеме, да еще и с различным количеством бит на пиксел. Чаще всего используется цветовая схема RGB - цвет каждого пиксела смешивается из трех компонент - красного, зеленого и синего, а для каждой компоненты используется восьмибитное представление, то есть всего таким образом можно отобразить 28x3=16777216 цветов. Если изображение в действительности содержит гораздо меньшее количество цветов, то такое представление является избыточным. В этом случае можно, например, занести имеющиеся цвета в таблицу, а цвет пиксела указывать, например, восьмиразрядным числом, показывающем положение нужного цвета в таблице. Такая таблица называется палитрой, а подобное представление графических данных - индексированным. Например, в случае шестнадцатибитного числа, соответствующего пикселу, изображение может содержать до 216=65536 различных цветов. Глубина цвета представляет собой логарифм по основанию 2 от максимально возможного количества цветов в выбранном представлении, а проще говоря, количество бит, используемых для представления одного пиксела.

     Форматов хранения графической информации в файлах существует, вообще говоря, великое множество. Например, формат BMP, будучи творением фирмы Microsoft, весьма примитивен и содержит только информацию о размере изображения, глубине цвета и собственно графические данные. А вот форматы GIF и JPEG содержат графические данные в сжатом виде, что позволяет значительно уменьшить объем файла (о сжатии данных см. ниже). Также графические файлы могут содержать и другую информацию: например пиксел может иметь не только цвет, но и прозрачность, в одном файле может содержаться несколько слоев изображения, в качестве цветовой схемы может использоваться не только RGB, но и например широко используемая в полиграфии CMYK и т. д.

     Наиболее приспособлен для хранения самых разных вариантов графических данных формат TIFF (Tagged Image File Format). Помимо собственно графических данных в разных видах такой файл может содержать еще множество полезной и не очень информации. Вывести эту информацию можно, например, с помощью программы tiffinfo. Особенно полезным является то, что файл TIFF помимо информации о размере изображения может содержать также и информацию о его разрешении. О том, что такое разрешение и чем оно отличается от размера, см. ниже на своем месте.

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

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

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

     Все эти действия можно произвести с помощью графического пакета GIMP. Для этого следует установить пакет GAP, сиречь GIMP animation package. Этот пакет представляет собой набор дополнений для создания анимированных картинок и видеороликов из набора изображений-кадров, но может использоваться и для пакетной обработки обычных изображений.

     Работать с GAP достаточно просто и изучения какой-либо документации обычно не требуется. После установки в основном меню GIMP появляется пункт "Video", в котором содержатся подпункты, вызывающие соответствующие дополнения:

Меню GAP

     Для работы с GAP файлы должны иметь имена вида P-N.ext, где P - произвольный префикс, N - порядковый номер файла, а .ext - расширение, соответствующее формату файла. Перед пакетной обработкой следует открыть первый по порядку файл и произвести перенумерацию (Frames Renumber), после чего можно сразу преобразовать исходные файлы в формат TIFF (Преобразовать кадры). Перед обработкой копии исходных файлов на всякий случай лучше сохранить.

     Для последующей обработки и хранения промежуточных файлов следует иметь достаточный запас свободного места на локальном диске. В случае нехватки свободного места при записи промежуточных файлов можно задать алгоритм сжатия LZW, а для монохромных изображений - CCITT Group4 Fax. Не следует при записи промежуточных файлов использовать сжатие JPEG.

 

О том, для чего нужно сжатие графических данных и какие алгоритмы сжатия бывают

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

LZW. Классический алгоритм Lempel-Ziv & Welch. Сжимает без потерь. Пригоден для любых изображений.

ZIP. Алгоритм, широко использующийся в архиваторах. Сжимает без потерь.

PackBits. Алгоритм PackBits. Сжимает без потерь. Степень сжатия средняя.

RLE. Алгоритм Run Length Encoding. Сжимает без потерь, эффективен при сжатии изображений с большими полями одного и того же цвета.

CCITT RLE. CCITT реализация алгоритма RLE для монохромных изображений.

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

JPEG. Алгоритм, разработанный Joint Photographic Experts Group для эффективного сжатия цветных фотографий. Сжимает с потерями, степень сжатия очень высокая и тем выше, чем больше потери при сжатии. Соотношение между степенью сжатия и потерями информации задается т. н. коэффициентом качества, оптимальное значение этого коэффициента составляет 75-80. Пригоден как для цветных, так и для черно-белых изображений. Не рекомендуется использовать для изображений, имеющих резкие цветовые переходы.

     Эти (и другие) алгоритмы могут использоваться для сжатия данных внутри графических файлов различных форматов, также и внутри файлов в формате PDF. Кроме того, в некоторых форматах графических файлов используются собственные алгоритмы сжатия. Так, например, файлы формата PNG имеют весьма эффективный алгоритм сжатия, особенно для монохромных изображений.

     Выбрав пункт меню "Кадрировать кадры" (Crop video frames) можно обрезать поля, вырезать из разворотов четные и нечетные страницы и т. п. Остальные возможности пакета GAP обычно использовать не требуется. Для различения четных и нечетных страниц можно переименовать файлы таким образом, чтобы четные и нечетные имели соответственно четные и нечетные имена файлов, после чего все файлы можно поместить в один каталог и еще раз произвести перенумерацию. Такое переименование можно сделать с помощью командных файлов, подобныхт приведенным ниже:

#!/bin/bash
for i in `seq 1 127` ; do
let j=i*2
mv ./prefix-`printf "%.6d" $i`.tif ./even/prefix-`printf "%.6d" $j`.tif
done

#!/bin/bash
for i in `seq 1 127` ; do
let j=i*2-1
mv ./prefix-`printf "%.6d" $i`.tif ./odd/prefix-`printf "%.6d" $j`.tif
done

     В итоге из вот таких примерно исходных файлов:

Разворот

должны получиться примерно такие страницы:


Четная страница


Нечетная страница

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

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

 

Что такое разрешение и чем оно отличается от размера.

     Эти два понятия почему-то часто путают. Размером изображения называется обычно количество пикселов по горизонтали и вертикали, безотносительно к линейным размерам как одного пиксела, так и всего изображения в целом. Разрешение же - это количество пикселов, приходящееся на единицу длины. Исторически сложилось так, что при обработке изображений в качестве единицы длины часто используется дюйм, поэтому и разрешение указывают в точках на дюйм (Dots Per Inich, или сокращенно DPI). Одни дюйм, как известно, равен 25,4 мм. Разрешение есть не только у изображений, но и у устройств отображения, и у печатающих устройств. Мониторы обычно обладают невысоким разрешением. Так, например, ЖКИ-монитор с размером матрицы 1280x1024 точек, диагональю 19 дюймов и соотношением сторон 4:3 имеет разрешение, как нетрудно посчитать, всего лишь около 90 DPI. А вот у принтера и сканера разрешение может достигать 1200 DPI, но у принтеров такое разрешение достигается только на монохромных изображениях (да и то не всегда), а при печати цветных (и черно-белых тоже) изображений существуют некоторые сложности, и на самом деле разрешение может оказаться намного меньшим.

     В большинстве форматов графических файлов разрешение не указывается. В этом случае оно обычно принимается равным 72x72 DPI. Разрешение, кстати, как правило задается двумя числами - по горизонтали и по вертикали (пиксел вовсе не обязан быть квадратным), если задано только одно число, значит разрешения по обоим направлениям равны.

     Большое значение имеет разрешение графического файла при выводе его на печать. Если, например, файл размером 1152x1600 пикселей имеет разрешение 150 DPI и выводится на лист размером 210x297 мм, то размер изображения на странице будет составлять примерно 195x271 мм, и при расположении изображения по центру страницы горизонтальные поля получаются чуть меньше 4,5 мм, а вертикальные - примерно 13 мм. Если бы разрешение этого же файла было 720 DPI, то размер изображения на листе составлял бы всего лишь 40,6x56,4 мм. А если бы разрешение файла было 72 DPI, то изображение вообще не влезло бы на лист размером 210x297 мм, так как его размер составлял бы целых 406x564 мм и при печати его пришлось бы масштабировать либо задавать большее разрешение.

     Для задания разрешения в файлах можно воспользоваться программой tiffset. Так, для задания разрешения 200 DPI выполним следующее (подробнее - man tiffset, как обычно):

tifset -s 286 2 *.tif 
tifset -s 292 200 *.tif 
tifset -s 293 200 *.tif 

     Если программа tiffset почему-либо не обрабатывает шаблоны имен файлов, то для обработки каждого файла можно воспользоваться командным файлом, подобным тому, который применялся для скачивания. Теперь соберем файлы в один многостраничный TIFF-файл:

tiffcp *.tif Document.tiff

     После этого из многостраничного TIFF-файла уже можно получить PDF-файл:

tiff2pdf -um -pA4 -oDocument.pdf Document.tiff

     Параметр -o задает имя выходного файла, если его опустить, файл будет выведен на стандартный вывод, что совсем ни к чему. Параметр -u задает единицы измерения в PDF-файле, в нашем случае это милиметры. Параметр -p задает размер бумаги, причем указывается имя одного из стандартных размеров, в нашем случае это бумага A4. Вместо стандартного размера можно с помощью параметров -w и -l указать соответственно ширину и высоту бумаги непосредственно в единицах, выбранных параметром -u, например:

tiff2pdf -um -w210 -l297 -oDocument.pdf Document.tiff

     Здесь же можно указать алгоритм сжатия. Программа tiff2pdf умеет сжимать цветные и черно-белые изображения по методам ZIP и JPEG, для чего используются параметры -z и -j соответственно. При использовании параметра -j параметр -q задает коэффициент качества сжатия JPEG:

tiff2pdf -um -pA4 -j -q75 -oDocument.pdf Document.tiff

tiff2pdf -um -pA4 -z -oDocument.pdf Document.tiff

     Если параметры -z или -j не указаны, то сохраняется сжатие, присутствующее в исходном файле. Монохромные изображения программа tiff2pdf сжимает по методу CCITT Group4 Fax, если только изображения в исходном файле уже не были сжаты таким образом. С помощью ключей -x и -y можно задать разрешение по ширине и высоте соответственно, если почему-либо этого не было сделано ранее. Если нужна более подробная информация - man tiff2pdf.

     Пользователи Windows для получения многостраничного файла могут воспользоваться программой IrfanView (View -> Multipage images ->Create multipage TIFF), этой же программой можно выставить разрешение. Для получения файла в формате PDF можно воспользоваться программой Adobe PDF Writer, которая представляет собой псевдопринтер; распечатать на этот псевдопринтер многостраничный TIFF-файл можно с промощью все той же IrfanView. Можно также установить драйвер любого PostScript-принтера (а лучше Adobe PostScript driver) и перенаправить его вывод в файл, а из получившегося PostScript-документа получить PDF или программой Adobe Acrobat Distiller, или, например, с помощью Ghostscript и GSview. Нужно внимательно следить за настройками программы Adobe PDF Writer или Adobe Acrobat Distiller (если для получения PDF-файла используется он): по умолчанию эти программы производят уменьшение размера графических изображений, что приводит к некоторой потере информации.

     Полученный документ следует проверить, и если результат приемлемый, можно удалить промежуточные файлы.

Subscribe

  • Новый год к нам мчится, скоро все случится

    А пока можно сделать кое-какие выводы. 1. Как и ожидалось, халява для РПЦ закончилась, и похоже, что навсегда. Наименее упоротые представители…

  • (no subject)

    Пока православно-патриотическая тусовка сходила с ума (как я и думал, их таки перевели на внешнее управление, закрепив тем самым на самой нижней…

  • (no subject)

    Очередная порция свежей гомосятины подоспела из МПшных недр как раз вовремя. Только было правящий режим попытался найти в ней поддержку и опору (а…

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 8 comments