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 にするのは 無駄な劣化が生じるので避ける。

pdf

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

のようにする。

Tags of current page

, , , ,