Ubuntu でスキャン画像の編集(自炊)
Ubuntu 10.10 で本をスキャンし、電子書籍リーダーで読むために 画像を編集したときに使ったコマンドのメモ。 保存はモノクロなら djvu で pdf に変換して Kindle で読んでいる。
zsh
画像それぞれに対してコマンドを実行
例えば、カレントディレクトリの png を jpg に変換するには
for f in *.png
convert $f $f:r.jpg
画像の名前を連番にする
i=0; for f in *.png
do
i=$((i+1))
mv $f $(printf "%03d" $i).png
done
tiff
ソフトウェア
ubuntu 10.10 だと libtiff-tools と imagemagick を使用する。
マルチページ tiff を分割
tiffsplit img.tiff
で分割できる。ファイルの prefix を 01_ とするには
tiffsplit img.tiff 01_
とする。
old-style JPEG compression mode
old-style JPEG compression mode だと tiffsplit が
Compression scheme does not support access to raw uncompressed data.
となってうまくいかない。 Linux で扱えるソフトウェアは見つからなかったので、 wine で irfanview を動かして利用する。 「Options」の「Extract all frames」でページを1ページ毎に 分割して取り出すことができる。
jpeg
無劣化で回転
mapivi を使えば無劣化で回転できるようだ。
imagemagick
回転
convert -rotate 90 img.png out.png
画像のサイズを取得
identify img.png
半分に分割
あらかじめ画像のサイズを取得して、半分になる画像のサイズを計算し
convert -crop 1000x2000 img.png out.bmp
のようにする。画像に番号がついて2つ作成される。
このときに、出力を png にすると切り取られた部分の画像の座標が 残っていて次に crop しようとするときにおかしなことになるので、 私は bmp に変換することが多い。
あと、出力を pbm にすると一つ目の画像しか作成されない。 一度、bmp などに出力してから pbm に変換することになる。
余白の切り取り
gimp などで一度画像を開き、どの範囲を切り取るのか調べておく。
convert -crop 2000x1000+100+50 img.png out.bmp
上、左の余白は100、50ずつ切り取られる。 画像のサイズは 2000x1000 であり、 右、下の残りの部分も切り取られる。
png や pbm に変換すると上の「半分に分割」の項目と同じ注意が必要。
色数を減らす
8色(kindle 用)の画像を作るために色数を8色にする。
convert -colors 8 img.png out.png
減色がきれいにいかない場合
http://www.troubleshooters.com/linux/scrshot.htm にあるように convert で減色するときは徐々に色数を減らしていくのが良いようだ。
convert -depth 24 img.png img.png
convert -depth 16 img.png img.png
convert -depth 8 img.png img.png
convert -colors 8 img.png img.png
のようにする。ただ、何回も変換しているので、当然、時間がかかる。
白黒を反転させる
covert -negate img.png out.png
djvu
複数の djvu をまとめる
djvm -c out.djvu *.djvu
モノクロ
pbm 画像に変換して cjb2 を使う。
convert img.png img.pbm
cjb2 img.pbm out.djvu
色数が少ない場合
convert -colors 8 img.png img.ppm
cpaldjvu -colors 8 img.ppm img.djvu
djvuphoto
写真などの画像は ppm に変換した後に c44 で djvu にする。
convert img.png img.ppm
c44 img.ppm
スキャンした画像で cjb2 と c44 ではデフォルトの dpi が違うようで 一緒にして djvu にする場合は -dpi オプションで同じ値を指定するとよさそう。
jpeg から直接 djvu に変換することができるが、 jpeg から加工した画像をまた jpeg にするのは 無駄な劣化が生じるので避ける。
djvu から変換
djvu2pdf を使うのが手軽。 http://sourceforge.jp/projects/freshmeat_djvu2pdf/
djvu2pdf img.djvu
png から変換
各ページの png 画像から pdf を作成する。 convert で全ページまとめた pdf を作るとメモリを多量に使うので、 現実的には pdf を作ることができない(2011-01-14)。 一枚ずつ pdf に変換して結合する。
for f in *.png
convert $f $f:r.pdf
pdftk *.pdf cat output out.pdf
pdf から画像に変換する
pdf から画像を取り出すには
pdfimages sample.pdf img
とする。img というプレフィックスがついた画像が作成される。
ruby
偶数ページと奇数ページに分ける
スキャンした画像ファイルを偶数番目と奇数番目に分けて処理するために スクリプトを作成した。 pick-out-arguments.rb
「*.png」 にマッチするファイルを偶数番目と奇数番目に分けるには
mkdir even odd
pick-out-arguments *.png | xargs mv -t odd
mv *.png even
とする。
シェルスクリプトでも可能なはずだが、ruby の方が慣れているので ruby で作成した。
xargs で convert の処理を複数のプロセスに分割する
xargs の -n1 -P2 とすればデュアルコア用に 2つのプロセスを同時に実行して 変換できる。
ただ convert は
convert <input> <output>
のような引数を受け取るのでこれを xargs でどう指定すれば良いのかわからなかった。 調べると http://linuxgems.com/?p=72 に書いてあるように --replace オプションと「{}」を使えばよいということがわかった。 たとえば
ls *.bmp | sed -e "s/.bmp$//" | xargs --replace -n1 -P2 convert {}.bmp {}.png
のようにする。