Scansnapで「いかに効率良く」本を電子化できるか試行錯誤してみた(スキャン&画像加工編)

前エントリからの続きです。

3.スキャン 10:27〜12:02(1時間35分)

いよいよやってきました本命作業、スキャンです。
いきなりスキャンといきたいところですが、まずは前準備。
生成されたスキャンデータを格納するための空フォルダを、あらかじめ用意しておきます。こんな感じです。

次に、Scansnap Managerでスキャンの設定を確認しましょう。私は以下のような設定を「コミック用」としてカスタム保存しています。

■アプリ選択

  • アプリケーションの選択:アプリケーションを起動しない

■保存先

  • イメージの保存先:(ローカルドライブのマイピクチャフォルダ)
  • ファイル名の設定:「自分で名前を付けます」「Aaa_」「連番3桁」

■読み取りモード

  • 画質の選択:スーパーファイン
  • カラーモードの選択:カラー
  • 読み取り面の選択:両面読み取り
  • 継続読み取りを有効にします:オフ
  • オプション:「文字をくっきりします」のみオン

■ファイル形式

  • ファイル形式の選択:JPEG

■原稿

  • 原稿サイズの選択:サイズ自動検出
  • マルチフィード検出:重なりで検出(超音波)

■ファイルサイズ

  • 圧縮率:1(圧縮率最弱、ファイルサイズ最大)

ポイントは保存ファイル形式にJPEGを選んでいることです。PDF形式であれば、スキャン後すぐに本単位でアーカイブされて手間入らずなのですが、いかんせんその後の整形処理や、別途二次加工したいとき(iPhoneKindleといった読み取り装置に合わせたデータの最適化など)に手間がかかります。その点、JPEGは加工や変換といった後工程での取り回しが便利なのです。

能書きはさておき、スキャンしてみましょう。まずはカバーから。
「あれ、そういえばカバーを裁断していなかったような…」と思った方は鋭い。実は私、カバーを裁断せずに長尺で読み込んでしまってます。

この向きで、スキャンボタンを点滅するまで長押ししてスキャン。ベロの部分が巻き込まれやすいので、手で支えながら読み込んでください。
1枚目が白紙(カバーの裏)、2枚目に長尺でカバー全面がスキャンされると思います。1枚目の加工は後でしますので、取り敢えずここはこのままで。

続いて本文のスキャンです。斜行防止&読取速度向上のため、横向きにスキャンします。

基本的に表紙から裏表紙まで順々にセットして読み込ませればOKなのですが、向きにだけ注意。「表紙を奥、向かって右手側が天になるように」(裁断面が上にくるように)セットしてください。この理由もあとで説明します。

今回スキャンしたAQUA/ARIAは各巻184ページ(カバー含む)でしたが、さすがにこの量を一気にセットするとScansnapが給紙できないので、2〜3回に分けてスキャンします(継続読取オプションをオフにしていますが、JPEGの場合、フォルダ内のファイルを見て、自動で連番を継続したファイル名で生成してくれるので問題なくスキャンできると思います)。

ちなみにどなたかも仰っていましたが、給紙されやすいように紙をずらしてセットすると、多少枚数が多くてもスムーズにフィードしてくれます。

スキャン速度はこのくらいです。

ちなみにスキャン時間に1時間半も要しているのには理由があって、Scansnap自体は1冊あたり1分強でスキャンできているのですが、スキャンで使用しているパソコンがかなりチープなため(CeleronM 1.5GHz、メモリ512MB…)ファイルが生成されるまでの待ち時間が同じくらいかかってしまっています。
なので、最近のWindows Vista/7が動くようなスペックのマシンをお持ちであれば、1時間程度でスキャンが完了するのではないかと思います。


待ち時間は、ほかの漫画を読んで時間潰し。ついつい読み耽ると作業が停滞するので気を付けましょう。

1冊スキャンが終わったら、最初に作っておいたフォルダにJPEGファイル一式を移します。横着してそのまま2冊目のスキャンに入ると、1冊目から継続の連番ファイル名が振られてしまい、泣ける事態になるのでご注意を。

ここでお腹が空いたので、45分ほど昼休み。続く加工作業に備えて、データをバックアップしておきました。
(この時点では1冊230MB、14冊合計で3GBほどのサイズでした)

ちなみに私の場合、これ以降の工程は別マシン(MacbookCore2Duo 2.0GHz、メモリ4GHz)を使ってます。理由は、続く画像加工工程が半自動化できているため、マシンを2台使うことでスキャンと画像加工を並行して進められるからです(パイプライン処理みたいなもんです)。そこまで本気出して作業することは滅多にないですが。

4.画像加工 12:45〜13:44(59分)

!注意!
ここでご紹介するやり方は効率重視のため、かなり「自分向け最適化」に走ってます。
内容的に稚拙なところもありますし、なにより汎用性をまったく考慮していません。
もし参考にされる方がいれば、丸ごと真似するのではなく部分部分の「エッセンス」を汲みとって頂ければ幸いです。

いきなりエクスキューズから入ってすみません。ひととおり書き出してみたら、あまりにわかりにくかったので…
画像加工するソフトは、WindowsでもMacでも豊富にありますので(代表的なのは「藤-resizer-」とかでしょうか)、ご自分のやりやすいツールで同じような処理をすればよいと思います。


では、本題。
スキャンしたデータを、扱いやすいように加工します。大まかに言うと、次のような作業があります。

  • 表紙ページの切り出し
  • 白黒ページのグレースケール化
  • ファイル名のリネーム
  • リサイズ
  • 回転
  • 圧縮率の調整

このうち、「表紙ページの切り出し」は手作業が必要なのですが、残りの作業はほぼ機械的に処理できるので、スクリプトの力を借りることにします。
スクリプト」とか書くと凄いモノを期待されそうで恐縮なのですが、自分は四半世紀前の8ビットマイコン時代にBASICをいじっていたロートル世代なので、最近の高級言語とかさっぱり付いていけてません。
今回はそんな自分でも何とか扱えそうなPerlImageMagickをチョイス。MS-DOSのバッチファイルに毛が生えた程度の低クォリティでお届けします。

まずは表紙の切り出しから。
先程カバーを長尺でスキャンしたデータが「Aaa_002.jpg」というファイルに入っていると思いますが、その中から表紙部分だけを切り出し、白紙だった1ページ目「Aaa_001.jpg」と差し替えます。
(大抵のリーダーソフトでは、1ページ目がサムネイルとして扱われるため、表紙が入っていると都合が良いのです)
使用するソフトは何でも構いませんが、私はWindowsIrfanviewを使ってます。

切り抜いた表紙を180度回転させて「Aaa_001.jpg」として保存。これを全冊分繰り返します。
「何かめんどくさいなぁ」という気がすると思いますが、裁断機できっちり表紙を裁断するのも結構神経を使うので、私はこの方法が気に入っています(デジタルですから何度でもやり直せますし)。
今回は14冊分で10分程度の作業でした。

さて、残りは自動化…といきたいところですが、もう一つだけ手作業があります。グレースケール処理を自動化するにあたり、カラーページと白黒ページの区別が付くよう、何らかの目印を付けてやる必要があるのです。
私の場合、安直ですがファイル名で区別するようにしました。

  • 「Aaa_xxx.jpg」カラーページ
  • 「aaa_xxx.jpg」白黒ページ

…何だか危険な香りがしますが、取り敢えずこれで何とかなっちゃってますので良しとしましょう。

先程スキャン時に設定したプレフィクスは「Aaa_」ですから、このままだと全ページがカラーページという扱いですね(カラー→白黒は不可逆なので、ミス防止のため敢えてこうしています)。
なので、Windowsならエクスプローラの「縮小表示」などの機能でざざっと全ページを眺めて、白黒ページのファイル名を「aaa_」にリネームしてやります。
といってもほとんどが白黒ページですから、1ファイルずつ手でリネームしてたら日が暮れてしまいます。ここは文明の利器に頼ります。

◆rename.pl

#!/usr/bin/perl
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

$snum = $ARGV[0];
$enum = $ARGV[1];
$flag = $ARGV[2];
if ($snum eq '' || $enum eq '') {
	die ('no argument.');
}

for ( $i = $snum; $i <= $enum; $i++ ) {
	$i3 = substr('000'.$i,-3,3);
	$oldname = 'aaa_'.$i3.'.jpg';
	$newname = 'Aaa_'.$i3.'.jpg';
	if ($flag ne 'r') {
		rename($oldname,$newname);
		print $oldname." => ".$newname."\n";
	} else {
		rename($newname,$oldname);
		print $newname." => ".$oldname."\n";
	}
}

お猿さんが書いたようなコードですね。いいんです。動くんだから。
使い方は、ターミナル(コマンドプロンプト)を起動し、リネームしたい本のフォルダ下にカレントを移して以下のコマンドを。

perl rename.pl 5 180 r

第1引数から第2引数までの連番ファイルを対象にリネームします。
(上の例だとAaa_005.jpg〜Aaa_180.jpgが対象)
第3引数の「r」を付けると「Aaa」→「aaa」、付けないと「aaa」→「Aaa」です。もう少し何とかならんかったのか、この仕様…


さて、無事にリネームが完了したら、いよいよ自動加工です。以下の内容を全冊/全ページに対して一括処理します。

  • グレースケール化:ファイル名が「aaa」の場合、実施
  • リネーム:「aaa」の部分をフォルダ名と差し替え
  • リサイズ:横最大2000、縦最大1142(※)でリサイズ(縦横比は維持)
  • 回転:奇数ページを左90度、偶数ページを右90度回転
  • 圧縮率の調整:圧縮率90%のJPEGで生成

Kindle DXのスクリーンサイズに合わせています。お好みで調整可。

◆rotate.pl(要ImageMagick

#!/usr/bin/perl
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;

$rflag = $ARGV[0];
if ($rflag eq 'r') {
	print "Rotate:ON\n";
} elsif ($rflag eq 'nr') {
	print "Rotate:OFF\n";
} else {
		die ('no rotate option (r or nr)');
}

@indirs = glob "*";
foreach (@indirs) {
	$dirname = $_;
	if ( -d $dirname) {
		$dirname2 = $dirname;
		$dirname2 =~ s/(\[)/\\\[/;
		$dirname2 =~ s/(\])/\\\]/;
		@infiles = glob $dirname2."/*.jpg"; 
		foreach (@infiles) {
			$filename = $_;
			$filename2 = $filename;
			$filename2 =~ s/aaa/$dirname/i;
			$deg = 90 - (substr($filename,-5,1) % 2)*180; #even=>90, odd=>-90
			if ($rflag eq 'r') {
				$rotate = ' -rotate '.$deg;
			} else {
				$rotate = '';
			}
			if ($filename =~ /Aaa/) {
				$gray = '';
			} else {
				$gray = '-type GrayScale ';
			}
			$str = 'mogrify'.$rotate.' -geometry 2000x1142 -quality 90 '.$gray.$filename;
			system $str;
			rename($filename,$filename2);
			print $str." => ".$filename2."\n";
		}
	}
}
print $filename."\n";
print substr($filename,1,1)."\n";

…21世紀にもなって、ここまで汚いコードをかける人間もなかなかいないんじゃないでしょうか、ええ。
使い方ですが、各本のフォルダの上位フォルダ(ここでいうとマイピクチャ直下)で、次のコマンドを叩きます。

perl rotate.pl r

第1引数のrオプションは必須です。代わりにnrを指定すると、回転処理だけを抑止できます(縦向きにスキャンした場合のために用意してます)。

全冊一気に処理するので、さすがにかなり時間がかかります(今回は35分)。完全自動ですので、30分アニメを一本見るなり、お風呂に入るなりして気長に処理を待ちましょう。寝る前にセットしておくのもいいですね。

ちなみにリサイズと圧縮のおかげで、ファイルサイズは1冊226MB→47MBまでダイエットできました。この位のサイズであれば保存場所に困ることはなさそうです。

5.アーカイブ 13:44〜13:47 (3分)

いよいよ最終工程、アーカイブです。
バラバラのJPEGファイルのままでも実用上問題ないんですが、1ファイルにアーカイブされていた方が扱いやすいので、無圧縮ZIP形式にまとめます。

使用するツールは何でも構いませんが、色々試してみたところシェアウェアのWinRARが便利そうです。

  • 複数フォルダを選択し、フォルダ単位で一括アーカイブ可能
  • 変換設定をプロファイルに記録し、エクスプローラの右クリックメニューから呼び出し可能

もちろんほかのツールでも構いません。
ただし、Mac環境のzipコマンド等で圧縮すると、Windows環境でファイル名が文字化けしてしまうようなので気をつけてください(おそらくファイル名がShift-JISかUnicodeかの違いが問題のようです)。

おわりに

ここまで読みにくい文章にお付き合いいただき、ありがとうございました。皆さんの蔵書スキャン作業の一助になれば幸いです。

Scansnapと付き合い始めてまだほんの数カ月ですが、自分にとってはもはや欠かせないマシンになっています。
蔵書の電子化は、収納スペースの節約というのが一番目に見えやすいメリットなんですが、「思い立ったらすぐに読める」「紙とは比較にならないくらい大量のコンテンツを持ち歩ける」という二つが大きな嬉しさなんじゃないかと、個人的には思っています。ちょうど、iTunesiPodが音楽の楽しみ方を大きく変えてくれたのと同じですね。
Apple電子書籍の販売に乗り出すみたいですが、「本のシャッフル再生」みたいなアバンギャルドな機能が付いてくれないかなー、とちょっと期待しています)


今回スキャンしたデータを表示。MacはComicViewer、iPhoneはiComicを使ってます。

それでは、楽しい読書ライフを。