Журнал LinuxFormat - перейти на главную

LXF123:Scan

Материал из Linuxformat
Версия от 12:23, 17 сентября 2010; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Сканирование изображений Загоните свои снимки в ПК с Linux и отредактируйте их

Содержание

Фото: Оцифруем ваши снимки

У вас полно коробок с фотографиями, жаждущими оцифровки? Марко Фиоретти покажет, как это сделать и разгрузить свои шкафы.

Цифровые камеры произвели революцию в получении, хранении и индексировании фотографий, но один момент они изменить не в силах: мы все еще держим тысячи снимков, сложенных в альбомы или коробки из-под ботинок где-нибудь в шкафу, и все они жаждут прорваться в ваш компьютер. Ситуация еще более осложняется, если фотографии попадают к вам ненадолго. Что делать, если друзья заехали к вам на пару часов с фотками вашего совместного отдыха, или тетушка Милли наконец-то одолжила вам свои драгоценные альбомы под честное слово вернуть их обратно в течение 24 часов? Как тут лучше поступить?

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

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

Решения без сканирования

Прежде чем углубиться в детали, поговорим об альтернативах сканированию типа сделай-сам. Одна из них – просто снести все фотографии, которые вы хотите иметь в цифровом виде, в специализированный магазин. Этот способ можно справедливо назвать самой малозатратной по времени стратегией, но кроме цены, тут есть пара серьезных минусов (не считая передачу ваших ненаглядных снимков в чужие руки). Во-первых, во многих таких пунктах выдается только формат JPEG с разрешением, непригодным для дальнейших манипуляций или распечатывания в большем размере. Кроме того, сервисы по сканированию не спасут, если фотографии поступили в ваше распоряжение лишь на ко-роткий промежуток времени, как в случае с друзьями, которые зашли к вам в гости. Некоторые просто переснимают отпечатанные фотографии цифровой камерой. Это имеет смысл, если невозможно найти сканер, но если он все же есть недалече, зачем применять метод, который не намного быстрее и выдает худшее качество?


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

С точки зрения качества, предпочтительно использовать TIFF (Tagged Image File Format). Это формат без потерь, сохраняющий все детали, которые были получены со сканера; вдобавок они сохраняются даже при последующей обработке. Единственная проблема с TIFF – размер файла. Отсканированное изображение формата A4 с наивысшим качеством, на какое только способны современные устройства начального уровня, может занять сотни мегабайт! Сжатая JPEG-версия того же изображения требует до 10 раз меньше места и выглядит не хуже – пока вы не захотите напечатать изображение с увеличением. Но настоящая проблема со JPEG – файл теряет в качестве при каждом открытии сжатого JPEG-файла, редактировании и повторном сохранении. Итак, выбор формата файла – самое простое решение: JPEG – хороший выбор для фотографий, которые вы наверняка не будете потом редактировать; в остальных случаях хитрым ходом будет приобрести еще один жесткий диск для хранения файлов в TIFF.

Профиль для вашего сканера

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

Под Linux, можно создать цветовые профили для вашего сканера, принтера и монитора, используя графический инструмент под названием Lprof (http://lprof.sourceforge.net). Lprof доступен в виде двоичного пакета в большинстве дистрибутивов. Если в вашей системе он все же отсутствует, его легко скомпилировать из исходных текстов, следуя инструкциям в файле README.

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

Точки и линии

Разрешение – это, в нашем случае, число точек, на которые распадается изображение при сканировании или печати. Разрешение в 600 точек на дюйм (dots per inch, dpi) означает, что каждый (линейный) дюйм изображения разделен на 600 частей, кодируемых независимо. При разрешении в 1200 dpi тот же дюйм делится на 1200 частей вместо 600. Короче, чем выше разрешение, тем лучше сохраняются мелкие детали изображения. Какое разрешение подойдет вам лучше всего? Ответ «самое большое из возможных» не имеет особого смысла, если вы не профессиональный фотограф, потому что при такой тактике вы мигом переполните свой жесткий диск, каким бы объемным он ни был.

Чтобы уяснить, какое разрешение предпочесть, нужно определиться, насколько большими должны быть ваши фотографии на экране монитора или на бумаге, чтобы они не выглядели зернисто или расплывчато. Если разрешение вашего монитора 1600 × 1200, это именно тот размер, который нужно задать фотографиям, чтобы они отображались во весь экран без потери качества изображения.


Если вы планируете печатать снимки, стоит принять во внимание разрешение, на которое способен ваш принтер. Гуру цифровой фотографии полагают, что печати на 600 и даже 300 dpi достаточно для непрофессионального использования. В любом случае, лучшим решением будет обратиться за советом к эксперту – а именно, раздобыть результаты работы программы Scanning and Printing Resolution Calculator [Калькулятор разрешения сканирования и печати], расположенной по адресу http://www.scantips.com/calc.html.

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

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

Захват фотографий

Лучший способ оцифровать фотографии – применить сценарий на языке оболочки, основанный на утилитах из двух проектов, включенных практически в любой дистрибутив Linux: SANE (Scanner Access Now Easy, http://www.sane-project.org) и ImageMagick (http://www.imagemagick.org).

Кладите свои фотографии, сразу по четыре, на стекло сканера, затем преобразуйте их в формат TIFF с помощью scanimage – инструмента SANE для сканирования из командной строки. Затем разделите единый файл, созданный scanimage, на четыре TIFF-файла одинакового размера: каждый из них будет содержать одну из четырех сканированных фотографий. У каждого из этих четырех файлов будет в названии порядковый номер. Кроме них, мы создадим файл индекса для последующего назначения тэгов и файлы JPEG меньшего размера – для размещения онлайн или загрузки в цифровые галереи вроде Digikam.


Скоро вы обнаружите, что 10 × 15 см – только номинальный размер, а многие отпечатки немного короче или длиннее. Даже перекос пластиковой рамки вокруг стекла может помешать правильной раскладке фотографий. Но вообще-то перекос, показанный на вкладке, возможно, самый ужасный из тех, с которыми нам довелось столкнуться, и на самом деле не все так плохо.

Сценарий для сканирования четырех изображений за раз приведен ниже в Листинге 1. Вам нужно будет отредактировать переменные в первой части в соответствии с вашими настройками и возможностями сканера, и это все, что требуется перед началом сканирования. Переменная $SCANNER должна содержать имя, которое scanimage присвоит вашему сканеру. Чтобы выяснить название модели вашего сканера, запустите следующую команду:

scanimage -L
device ‘gt68xx:libusb:004:002’ is a Mustek ScanExpress 1248 UB flatbed scanner

$SCANNER_OPTIONS зависит от вашего сканера и драйвера SANE для Linux. Поддерживаемые опции можно найти, вызвав scanimage следующим образом:

scanimage ----help -d <ИМЯ УСТРОЙСТВА>

где <ИМЯ УСТТРОЙЙСТВА> определяется scanimage -L. Первая опция в скрипте, -p, активирует вывод индикатора прогресса. Следующие три задают сканеру сохранение цветных изображений с разрешением 1200 dpi в формате TIFF.

На последних двух параметрах давайте остановимся подробнее. Многие отпечатанные фотографии имеют размеры 10 × 15. Если вы поместите четыре таких снимка на любой сканер формата A4, отсканированное изображение будет содержать черные полосы по длинным сторонам. Опции -l и -x велят scanimage не включать их в файл TIFF: программа сохранит только изображение шириной 205 см, отступив сперва на 9 мм с левого края.

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

convert 4_pictures_scan.tiff -crop +10+0 +repage 4_pictures_scan.tiff
convert 4_pictures_scan.tiff -crop -10+0 +repage 4_pictures_scan.tiff

Они будут отрезать полоску шириной в 10 пикселей слева и справа от исходного изображения.

Скрипт сканирования

Вернемся к сценарию: два каталога, обозначенных в строках 6 и 7, предназначены для хранения мастер-копий и версий JPEG более низкого качества. Для мастер-копий потребуется уникальный идентификатор. Он представляет собой число, $PICNUM, которое сохраняется в файле $HOME/.scanning_picture_num между различными выполнениями скрипта. Строка 19 получает текущее значение $PICNUM из файла; затем, со строки 25, начинается самое интересное. Мы запускаем scanimage с правильными опциями и сохраняем результат в файле 4_pictures_scan.tiff. Строка 26 – именно то, что разделяет исходный большой файл на четыре части. Команда convert разрезает 4_picture_scan.tiff на четыре отдельных изображения, пронумерованных от 0 до 3. Для правильной работы, ширина и высота каждой части (то, что следует после -crop) должны быть равны половине от большого файла, созданного ранее. Как определить его размер? Спасибо команде identify из ImageMagick:

identify 4_pictures_scan.tiff
4_pictures_scan.tiff TIFF 9686x14126 9686x14126+0+0
DirectClass 8-bit 391.458mb 4.600u 0:08

то есть в нашем сканере 4_pictures_scan.tiff это 9686 на 14126 пикселей – прямоугольник, размер которого 4843 × 7063, есть ровно четверть исходного изображения. Чтобы выяснить правильные значения для других сканеров, вам придется запустить identify самим.

Цикл в строках 27–35 сохраняет «четвертушечные» изображения внутри $MASTER_PIC_DIR и присваивает каждому порядковый номер. Он также сохраняет сжатую на 50 % версию JPEG в другом каталоге (который в нашем скрипте находится внутри папки, используемой Digikam по умолчанию). Строка 34 дописывает название файла к текстовому индексу.

Строка 36 вызывает диалоговое окно, изображенное слева вверху. Если вы хотите сканировать еще четыре изображения, положите их на стекло, нажмите ОК, и скрипт перезапустится (с новыми значениями $PICNUM) со строки 23, а в противном случае завершит работу. Одно сканирование при максимальном разрешении может занять несколько минут, но оно не требует вашего вмешательства: после каждого прогона скрипт будет спокойно ждать.

 Листинг 1: scanscript.sh
 1 #! /bin/bash
 2
 3 STOP_NOW=’0’
 4 SCANNER=”’gt68xx:libusb:004:002’”
 5 SCANNER_OPTIONS=’-p --format=tiff --mode=Color --resolution=1200dpi -l 9 -x 205’
 6 MASTER_PIC_DIR=/mydata/MASTER_PICTURES_DIR
 7 GALLERY_DIR=/home/marco/Pictures/scandir
 8 PIC_PREFIX=master_picture_
 9 DATE=`date ‘+%Y%m%d%H%M’`
 10 TAGFILE=picture_tags_$DATE.txt
 11 touch $TAGFILE
 12
 13 if [ ! -e $HOME/.scanning_picture_num ]
 14 then
 15 echo “Отсутствует файл с номером изображения”
 16 exit
 17 fi
 18
 19 PICNUM=`cat $HOME/.scanning_picture_num`
 20 clear
 21
 22 while [ $STOP_NOW -eq “0” ]; do
 23 echo “Сканирую еще 4 изображения, начиная с номера $PICNUM...”
 24 rm -f 4_pictures_scan.tiff
 25 scanimage -d ‘gt68xx:libusb:004:002’ $SCANNER_OPTIONS > 4_pictures_scan.tiff
 26 convert 4_pictures_scan.tiff -crop 4843x7063 +repage temp_picture_%d.tiff
 27 for QUADRANT_NUM in 0 1 2 3
 28 do
 29 let “PICNUM = PICNUM + 1”
 30 echo Сохраняю temp_picture_$QUADRANT_NUM.tiff в $MASTER_PIC_DIR/${PIC_PREFIX}_$PICNUM.tiff
 31 mv temp_picture_$QUADRANT_NUM.tiff $MASTER_PIC_DIR/${PIC_PREFIX}_$PICNUM.tiff
 32 convert $MASTER_PIC_DIR/${PIC_PREFIX}_$PICNUM.tiff -quality 50% $GALLERY_DIR/$PICNUM.jpg
 33
 34 echo${PIC_PREFIX}_$PICNUM.tiff: “ >> $TAGFILE
 35 done
 36 zenity ----question ----text “Отсканировать еще 4 изображения,\nначиная с номера $PICNUM?”
 37 STOP_NOW=$?
 38 done
 39 echo $PICNUM > $HOME/.scanning_picture_num
 40 exit

Обвесимся тэгами

Скрипт сканирования в Листинге 1 – все, что нужно для сохранения ваших фотографий, но он не делает ничего, чтобы присвоить им тэги. Вы, конечно, можете проделать это с помощью графической программы вроде Digikam, или использовать скрипт geotagger.sh, описанный в учебнике по геокодированию, доступном на DVD к LXF112 (или по адресу http://www.tuxradar.com/content/geotagging-linux). Текстовые индексы, сгенерированные с помощью scanscript.sh, выглядят следующим образом:

[marco@polaris lxf_scan]$ more picture_tags_200906171103.txt
master_picture__1140.tiff:
master_picture__1141.tiff:
master_picture__1142.tiff:
master_picture__1143.tiff:

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

more picture_tags_200906171103_edited.txt
master_picture__1140.tiff: Sardinia cliffs 20070811 20
master_picture__1141.tiff: Vesuvio crater 20040906 35
master_picture__1142.tiff: Simbruini Regional Park 20060725 52
master_picture__1143.tiff: Karnten 20030830 18

Это значит, что вы можете модифицировать скрипт geotagger.sh для чтения и записи всех данных в качестве комментариев Exif внутри графических изображений. После этого любое Exif-совместимое приложение сможет проиндексировать или найти ваши фотографии автоматически. Единственное ограничение данного подхода состоит в том, что на момент написания статьи утилита exiftool, используемая в geotagger.sh, не поддерживала добавление полей в файлы TIFF. Однако, если вы сохраните текстовый индекс со всеми комментариями, то сможете добавить тэги к вашим отсканированным TIFF-файлам, как только exiftool расширит свои возможности, поэтому стоит внести в индекс сопутствующую информацию, даже если вы пока не можете найти ей применение.

Нетехнические советы

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

Еще до включения компьютера стоит определить, что вы не будете сканировать: так ли вам необходимы все 10 почти идентичных фото вашего сына в его первый школьный день? А как насчет всех тех фотографий, качество которых настолько низкое, что будь они не ваши, вы бы долго над ними потешались? Рухнет ли мир, если вы просто их выбросите или проигнорируете? Есть шанс, что беды не случится, и чем меньше вам нужно сканировать, тем быстрее вы закончите. Ах, да, помните еще: всегда сохраняйте оригиналы сканированных изображений неизменными. Не редактируйте их: возможно, на будущий год вы захотите обработать их новым инструментом!

Персональные инструменты
купить
подписаться
Яндекс.Метрика