Шло время, рабочий компьютер поменялся по воле неосторожной кружки чая, мать её за ногу. Решил на новый компьютер поставить Debian, ибо привычнее. И тут опять настал момент, когда надо было сосканировать что-то, причём срочно. Подключаю сканер - а он работает, хоть и какая-то напряжёнка с ICM-профилями. Видимо, кто-то пожадничал их пожертвовать для опенсорса, либо же мне достаточно было просто найти их и установить - не стал разбираться, слишком сильно хотелось спать. Самое главное, что стало можно удобно сканировать что угодно. Стоп, а если подключить к серверу без GUI и запустить scanimage? Хм, работает. Класс!
Так, а на корпусе сканера есть кнопочка. Никогда ей не удавалось в Винде воспользоваться, ноль эмоций. Тут, впрочем, тоже. Запрос в Гугл нашёл два проекта - scanbuttond и scanbd. Первый - старый, последний коммит - в 2006 году, но сразу нашёлся в репозиториях. Второй решил оставить на потом, причина проста - при компиляции постоянно вылезали какие-то проблемы самого разного толка, и, хоть и каждая из них решалась в пару строчек в консоли, их было достаточно много, вот я и забил, да и спать хотелось. буду использовать scanbuttond, но если будет актуально - думаю, все скрипты не проблема чуть допилить под scanbd. Вопрос, конечно, в том, насколько не проблема… Но пока - scanbuttond.
Первый скрипт - buttonpressed.sh
#!/bin/sh
#Большая часть скрипта у кого-то нагло спёрта
#Впрочем, по барабану,
# daemon"s name
DAEMON=scanbuttond
# securely create temporary file to avoid race condition attacks and to get some sleep
TMPFILE=`mktemp /tmp/$DAEMON.XXXXXX`
# lock file
LOCKFILE="/tmp/$DAEMON.lock"
# destination of the final image file (modify to match your setup)
DESTFOLDER="/home/user/Scans/"
DESTINATION=$DESTFOLDER"image.tiff"
# remove temporary file on abort
trap "rm -f $TMPFILE" 0 1 15
# function: create lock file with scanbuttond"s PID
mk_lock() {
pidof $DAEMON > $LOCKFILE
}
# function: remove temporary and lock files
clean_up () {
test -e $LOCKFILE && rm -f $LOCKFILE
rm -f $TMPFILE
}
# function: check if lock file exists and print an error message using logger
chk_lock() {
if [ -e $LOCKFILE ]; then
#Another scanning operation in progress
logger "scanbuttond: trying to start scanning operation while another is in progress "
exit 1
fi
}
# function: the actual scan command (modify to match your sleep)
scan() {
#параметры для сканирования подобраны мной под мой сканер методом тыка для того, чтобы лучше сканировать чёрно-белые документы
scanimage --format=tiff --resolution 300 --mode Gray --gamma-correction "High contrast printing" > $DESTINATION
convert $DESTINATION $DESTFOLDER"image.jpg"
logger "Filename: " `python /etc/scanbuttond/convert_scan.py`
rm $DESTINATION
}
chk_lock
mk_lock
scan
clean_up
Второй скрипт - convert_scan.py
import os
filename = "image.jpg"
directory = "/home/user/Scans"
os.chdir(directory)
try:
filenames =
except KeyError:
filenames =
counter = 1
new_filename = "scan_000.jpg"
while new_filename in filenames:
new_filename = "scan_"+str(counter).zfill(3)+".jpg"
counter += 1
print new_filename
os.rename(filename, new_filename)
А именно:
Автоматической сортировки сканов по директориям. Как я себе это представляю?
>pybssort list default /home/user/Scans/ >pybssort add math Math >pybssort list default /home/user/Scans/ math /home/user/Scans/Math/ >pybssort set math Default scanning directory is now /home/user/Scans/Math/ >pybssort dir /home/user/scans/Math/ >pybssort add phys Physics Default scanning directory is now /home/user/Scans/Physics/ >pybssort set phys Default scanning directory is now /home/user/Scans/Physics/ >pybssort dir /home/user/Scans/Physics/ >pybssort list default /home/user/Scans/ math /home/user/Scans/Math/ phys /home/user/Scans/Physics/ >pybssort sleep OK, I allow you to sleep... No, wait, finish your article! >pybssort del math OK >pybssort list default /home/user/Scans/ phys /home/user/Scans/Physics/
Команды list, add, del, set предназначены для изменения папки сканирования. Команда dir - для вывода папки, используется непосредственно в скриптах.
Хм, а как назвать эти вот все default, phys, math? Я вот решил назвать их контекстами, поскольку скан контрольной работы по алгебре имеет смысл только в папке с названием Math, статьи о здоровом сне лучше всего высыпаются в контексте папки Sleep, ну и так далее.
Что в итоге вышло?
Простая программа на Python. Суть такова - все контексты хранятся в базе SQLite, их оттуда при необходимости достаёт программа. Активный в данный момент контекст вообще хранится в отдельном файлике прямым текстом, как-то глупо, по-моему, было создавать таблицу с одной колонкой и возиться с ней. Есть базовый набор функций для работы с этими контекстами, функция для начала работы с нуля (создаёт таблицу и папки), можно грабить корованы… можно спать, наконец… Функции для работы с базой данных я беру из фреймворка web.py, на котором разрабатываю свои мелкие проектики.
Почему не использовать встроенный модуль sleeplite3 sqlite3? Почему я беру целый веб-фреймворк, чтобы взять из него только лишь web.database? Ответ прост - это банальная лень. Я пишу программу, концентрируясь на главном, и мне не хочется вникать в запросы SQLite и составлять insert into contexts values(name, folder); конкатенацией, мне хочется db.insert("contexts", name=name, folder=folder) и спать. Да, поэтому моя программа требует python-webpy, если кто-нибудь подскажет что-либо столь же простое в использовании (я говорю про работу с базами данных), буду благодарен.
Что нужно сделать для установки?
wget https://gist.github.com/CRImier/7330722/raw/pybssort.py
#Изменяем начальную директорию для сканирования
nano pybssort.py
chmod +x pybssort.py
mv pybssort.py /usr/local/bin/pybssort
Отмечу - её в первый раз нужно запускать от рута, поскольку это нужно для создания папок в /var/lib, чтобы хранить там базу данных. После первого запуска рут не требуется. Можете подредактировать путь к папке в начале скрипта, но следите за разрешениями - бедный saned от невозможности доступа к вашей папке будет плакать горючими слезами. Вы ведь не хотите его расстроить, верно?
А как её связать с уже существующими скриптами? Да просто в первом скрипте нужно вставить "pybssort dir" вместо захардкоженной DESTINATION, а во второй скрипт ту же переменную передать аргументом командной строки.
Как-то так:
Первый скрипт
...
# destination of the final image file (modify to match your setup)
DESTFOLDER=`pybssort dir`
DESTINATION=$DESTFOLDER"image.tiff"
...
# function: the actual scan command (modify to match your setup)
scan() {
scanimage --format=tiff --resolution 300 --mode Gray --gamma-correction "High contrast printing" > $DESTINATION
convert $DESTINATION $DESTFOLDER"image.jpg"
logger "Filename: " `python /etc/scanbuttond/convert_scan.py $DESTFOLDER`
rm $DESTINATION
}
...
Второй скрипт
import os
import sys #необходим для получения аргумента...
directory = sys.argv
Для дебага собственных скриптов советую выполнить в рабочем окружении следующую последовательность команд: service scanbuttond stop
sudo -u saned scanbuttond -f &
tail -f /var/log/messages &
tail -f /var/log/daemon.log &
И использовать в скриптах echo, logger и print (для Python).
Критика насчёт всех трёх скриптов, исполнения, красоты кода, отступов, орфографии, оформления топика, bad practices в коде и логике, актуальности решения, возможных дополнений, адекватности автора и прочего приветствуется.
Этот BASH-скрипт через какое-то время меня порядком достал - никак не мог вписать нормальную обработку ошибок. Плюнул, переписал скрипт на Питоне. Работает в итоге даже лучше. Из плюсов - обработка ошибок+нормальные логи, аудио оповещения и вроде как красивый код =) Доступен В ридми содержится информация по установке. У меня всё работает бесперебойно… Ну а если что-то не работает, прошу сообщать =)
Теги:
От добрых людей попал мне в руки вот такой достаточно престарелый сканер, Mustek 6000p, аппарат времен Windows 95 и больших белых пластиковых корпусов. Как раритет большой ценности он не представляет, но выбросить, не заглянув внутрь, жалко).
Собственно, все его электронное содержимое, корпус отправляется на помойку.
Осветитель из сканирующей каретки - обычная флуоресцентная лампа с холодным катодом (CCFL), подобные используются в подсветке LCD-матриц.
Плата с каретки. В левой части видим высоковольтный инвертор, пришло время попробовать зажечь лампу.
В левом углу - интегральный стабилизатор 7812, обозначенный как Q8, по нему легко понять, по каким дорожкам инвертор получает питание. На его входе при включении сканера около 14 вольт, но лампа не горит, как ее запустить? К участку платы с инвертором ведет не так уж и много дорожек от разъема, которым плата каретки соединяется с основной платой, поэтому предположим, что на транзисторе Q5 собран ключ, запускающий лампу.
Замкнем пинцетом резистор R3, соединенный с базой транзистора, на + питания, и… да будет свет!
Разобравшись, что к чему, обрежем все лишнее, впаяем резистор-перемычку между R3 и питанием…
… и штырьки для родного разъема питания принтера.
Получим вот такую аккуратную плату-инвертор, проверяем еще раз.
Для освещения рабочего места этого, конечно же, недостаточно, но можно сделать в каком-нибудь ящике подсветку по принципу лампы в холодильнике. В качестве донора корпуса неплохо подошла не менее престарелая мышь, ровесница сканеру. Выключателем же будет геркон с нормально замкнутыми контактами.
В собранном виде. Жаль, что кнопки не несут никакой функциональной нагрузки=)
Крепим лампу и корпус на двухсторонний скотч. На дверце - магнит от жесткого диска на том же скотче. Не особо эстетично, но задачу выполняет.
Для освещения небольшого пространства более чем достаточно
Внимательный читатель заметит, что на фото платы в корпусе мыши уже перемычка вместо стабилизатора - в нем больше нет необходимости, инвертор питается от домашнего сервера, который стоит на том же шкафу.
Люди чаще всего выкидывают то, что могло бы еще использоваться, пускай и не по прямому назначению. Иной раз горько видеть как несут на помойку вполне работоспособные вещи.
Одним из примеров изготовления является сборка светильника из старого сканера своими руками.
Для изготовления самодельного светильника использовался старый сканер Mustek 6000p, он был актуален еще во времена Windows 95, сканер требует realtime доступа и поэтому в современных системах жутко тормозит, тратя на сканирование страницы по 4-5 минут.
Вот что у сканера внутри, ну кроме двигателя протяжки сканирующего элемента.
Осветитель из сканирующей каретки - обычная флуоресцентная лампа с холодным катодом (CCFL), подобные используются в подсветке LCD-матриц.
Плата с каретки. В левой части виден высоковольтный инвертор, который используется для питания лампы сканера.
В левом углу - интегральный стабилизатор 7812, обозначенный как Q8, по нему легко понять, по каким дорожкам инвертор получает питание. На его входе при включении сканера около 14 вольт, но лампа не горит, как ее запустить? К участку платы с инвертором ведет не так уж и много дорожек от разъема, которым плата каретки соединяется с основной платой, поэтому предположим, что на транзисторе Q5 собран ключ, запускающий лампу.
Замкнем пинцетом резистор R3, соединенный с базой транзистора, на + питания, и… да будет свет!
Разобравшись, что к чему, обрежем все лишнее, впаяем резистор-перемычку между R3 и питанием…
… и штырьки для родного разъема питания принтера.
Получим вот такую аккуратную плату-инвертор, проверяем еще раз.
Для освещения рабочего места этого, конечно же, недостаточно, но можно сделать в каком-нибудь ящике подсветку по принципу лампы в холодильнике. В качестве донора корпуса неплохо подошла не менее престарелая мышь, ровесница сканеру. Выключателем же будет геркон с нормально замкнутыми контактами.
В собранном виде. Жаль, что кнопки не несут никакой функциональной нагрузки=)
Крепим лампу и корпус на двухсторонний скотч. На дверце - магнит от жесткого диска на том же скотче. Не особо эстетично, но задачу выполняет.
Для освещения небольшого пространства более чем достаточно
Статья о том как сделать самодельный фотоаппарат из старого планшетного сканера.
Есть статья на сайте Wired.com, описывающая как в домашних условиях сделать из обыкновенного Canon’овского сканера цифровой фотоаппарат. Парень говорит (и показывает процесс в фотографиях) о том, что сделав такую камеру в конце концов получил не совсем то, чего ожидал - уродливый размазанный блик света на черном фоне, вместо фотографии (на фото ниже).
Краткие принципы изготовления и работы такой камеры.
Принцип работы.
Камера работает точно так же, как и любой фотоаппарат. Линза проецирует изображение на светочувствительный элемент. Вы можете найти тонны информации по этой теме. В данном варианте одно отличие - роль светочувствительного элемента играет обычный планшетный сканер. Простейшая и супердешевая камера, как выяснилось, собирается из черного пенокартона, картонной трубы, пластиковой линзы, и собственно любого сканера.
Но такой вариант не идеален - он имеет массу недостатков выражающихся в маленьком угле обзора, фиксированном фокусе, плохой глубине резкости и всех недостатках связанных с не модифицированным сканером (для хороших результатов сканер нужно модифицировать).
Снимок с такой вот супердешевой фотокамеры.
Как улучшить качество.
Как вариант можно приобрести и модифицировать древнюю фотокамеру 30-х годов, превратив ее в дикий гибрид старинных и современных технологий.
Такая камера, как говорят, резко отличается по своему качеству в лучшую сторону от более примитивных вариантов.
«Цифровая камера», которую вы никогда не сможете купить в «Эльдорадо»:)
Снимок с такого гибрида, намного более качественный, чем с примитивного варианта.
Такие камеры вы сможете достать намного легче, чем барахло 30-х годов. Камеры почти не нужно модифицировать, они наиболее простым способом превращаются в цифровой фотоаппарат:)
Снимок с такой камеры типа «brownie».
Современное сканерофотокамеростроение.
Ролик, показывающий создание самодельной камеры.
О том, как сканер видит время.
Планшетный сканер не сразу получает целую картинку сцены. Сканер получает изображение читая его линия за линией. Чтобы отсканировать одну фотографию обычно затрачиваешь от 15 секунд до 5 минут, это время зависит от выбранного разрешения. Каждая линия изображения получается сканером в считанные миллисекунды.
Вот вам пример, который еще проще все объясняет. Например, нам нужно отсканировать изображение представляющее из себя квадратную картинку состоящую из 15,000 пикселей по ширине (соответственно в картинке содержится всего 225,000,000 пикселей). Сканирование занимает 90 секунд. Каждая линия изображения читается одна за другой, примерно 6 миллисекунд каждая. Это происходит 15,000 раз, пока головка сканера двигается от начала картинки до ее конца. Но ведь пока сканер читает изображение, оно может двигаться. Таким образом, объект может сдвинуться, а сканер, оставляя ранее захваченное изображение объекта будет дальше захватывать уже новое его положение (причем, каждые 6 миллисекунд).
Картинка показывает, как видит сканер сцену на каждом отрезке времени сканирования.
А вот картинка, которая получается по завершении сканирования.
Такой эффект просто невозможно создать используя традиционные инструменты. В принципе такое можно сделать используя обычную видеокамеру (изображение будет состоять из примерно 750 линий и будет низкого разрешения), но изображение и близко не будет похоже на «отсканированное».
Как насчет цвета?
Главный вопрос, который задается по теме «фотоаппарат из сканера» - это «куда делись цвета, и почему все фотографии только черно-белые?». Ответ на этот вопрос связан с самой процедурой захвата сканером цветного изображения. Для того, чтобы захватить цветное изображение, сканер разбивает картинку на три канала - красный, зеленый и голубой, эти каналы получаются при помощи освещения картинки лампой, сканер захватывает каждую линию каждого канала отдельно, используя светочувствительный сенсор воспринимающий только оттенки серого, а затем объединяет эти три канала в одно цветное изображение. Фото-аппарат собранный из сканера не использует эту лампу, он использует свет спроецированный линзой, соответственно все три канала идентичны и финальное изображение получается черно-белым (grayscale). Есть правда исключение, когда камера сканирует сцену, в которой цвета меняются быстрее, чем происходит сканирование, это относится к быстрому обновлению телевизионного экрана или экрана монитора, получается этакий цветовой всплеск на черно-белом изображении.
Цветовая вспышка на этой картинке создана высокой скоростью обновления экрана компьютерного монитора. Дисплей меняет цвета быстрее, чем сканер считывает линию изображения, поэтому монитор рябит цветами.
Фотогалерея.
Приведенные здесь снимки сняты приимущественно такой вот сканерофотокамерой:
Эта камера основана на сканере Canon Lide 20, использующей CIS-сенсор. Максимальное разрешение данной камеры 115,200,000 пикселей на снимок, что эквивалентно 115,2 мегапикселям. :)
Здесь Реанна Уокер получилась необычной, обратите внимание на ее глаза - она моргала в процессе сканирования (тьфу ты, фотографирования:)).
Концерт с точки зрения сканерофотоаппарата.
Кристиан Нолд зевает большую часть снимка:)
Автомобили проезжающие по дороге за автобусной остановкой.
Ноттинг Хилл.
Снимок с крыши Королевского Колледжа Искусств, показывающий движение трафика внизу.
Увеличенная часть снимка, показывающая как искажаются движущиеся автомобили.
Еще одна картинка с той же крыши, автомобили едущие с большей скоростью на снимке искажены больше.
Лучше всего на снимке получился автобус:)
Камера придала двухэтажному автобусу почти архитектурную форму.
Три снимка из художественной студии колледжа.
Девушка на снимке получилась с двумя лицами. Фотография была заранее срежиссирована.