はじめに

随分前に 裁断機を買いました 。 この時にスキャンしたものはjpegをzipで固めてSambaの共有ディレクトリに配置、Nexus9で ComittoN を使って閲覧できるようにしていました。 この形はデバイス本体にファイルを置かないため、ストレージの空きを気にしなくてよいのがメリットな一方、当たり前ながらSambaにアクセスできる環境でしかファイルを閲覧できません。 VPNを構築すればこの制限は回避できます。

ただしかし手元にある本の数がそれほど多いというわけではないけれど、物理的な本がこれ以上増え続けるのもどうかなと思い始めてきたので、最近新しく買う本はKindleにしようかどうかと考えていました。 そこで、もしKindleへ移行した場合、既存のデータもKindleで読むことができないかと考えました。 スキャン済みのデータは多くないので簡単に変換できるようであれば変換してしまってKindleに一本化したいというのが今回の動機です。

スキャン後の画像データを調べる

今回はmobi形式のデータを作成するのに Kindle Comic Creator と画像の前処理にImageMagic を使います。

image

お試しとして、以前スキャンした攻殻機動隊のデータを使いました。 この冊子のデータは300ppiでスキャンしたもので、表紙、裏表紙を含めて全部で52枚(000001.jpg-000052.jpg)、 縦が2125-2166px、横は1473-1489pxでした。ScanSnapが適当にトリミングするので画像の大きさにばらつきがあります。 Kindle Comic Creatorは全ての画像が同じアスペクト比になっていないとダメみたいなので余白を加えるなどして調節が必要そうです。 あとNexus9の解像度が2048x1536で、それ以上大きくても意味がないので少し縮小した方がサイズの節約になりそうです。

Kindle Comic CreatorがWindows/Mac対応だったのでMacで作業しました。 ImageMagicはhomebrewでインストールしました。 正しくインストールされていれば identifyconvert コマンドが使えるようになっているはずです。

既に上に書いてありますが、まず画像のサイズにどれくらいばらつきがあるか調べましょう。 画像が置いてあるディレクトリに移動して以下のコマンドを実行すれば縦横の最大最小がわかります。

$ identify -format "%h\n" *.jpg 2>/dev/null | sort | sed -n '1p;$p'
2125
2166

$ identify -format "%w\n" *.jpg 2>/dev/null | sort | sed -n '1p;$p'
1473
1489

原本を既に捨ててしまったので、元々の本のサイズが何であったかわかりませんでした。 その場合は以下のようにしてppiとpxからだいたいのサイズをmmで求めることができました。 そのサイズを参考にして 紙の寸法 から近い用紙を探します。 今回は JIS B6 (182x128mm) だったみたいです。

$ identify -format "%[fx:h/resolution.y*25.4]x%[fx:w/resolution.x*25.4]mm\n" 000001.jpg
182.203x125.053mm

縮小後のサイズを決める

JIS B6の長辺(182mm)と短辺(128mm)の比( 182 / 128 = 1.4218 )はだいたい 1.4218:1 です。 この比を使って元データの長辺(2166px)から短辺を求めると 2166 / 1.4218 = 1523.4210px でした。 これより大きい元データはないので、短辺に余白を追加することでJIS B6のアスペクト比に合わせるという方針にします。 (ちなみに元データの短辺(1489px)から長辺を求めると 1489 * 1.4218 = 2117.0602px で、元データの長辺のほうが大きいのでダメ)

JIS B6の比でNexus9の画面の長辺(2048px)から短辺の長さを求める( 2048 / 1.4218 = 1440.4276px )とだいたい 1440px になります。 ということで、元データを 2048x1440px へ縮小して、左右の足りない部分は余白を追加することにします。 ちなみに bc コマンドを使って計算してみました。

$ echo "scale=4; 2048 / (182 / 128)" | bc
1440.4276

縮小する

Kindle Comic Creatorの仕様(?)的に カバー画像 と呼ばれる書籍一覧に表示される表紙に該当する画像は、 他のページと同じアスペクト比になっていなくてもよいみたいなので、表紙(000001.jpg)だけは元データのアスペクト比のまま縮小します。 また、縮小する際に -strip オプションを付けてEXIF等の不要な情報を削除します。

$ mkdir out
$ convert -resize x2048 -strip 000001.jpg out/000001.jpg

裏表紙(000052.jpg)は通常ページと同じ扱いなので余白(背景は黒)を追加してアスペクト比を調節しますが、 見開きページとして設定しないので中央に配置( -gravity Center )して、左右に追加されるようにします。

$ convert -resize 1440x2048 -strip -gravity Center -background black -extent 1440x2048 000052.jpg out/000052.jpg

表紙、裏表紙以外のページ(000002.jpgから000051.jpg)を縮小します。 これらのページも余白を追加しますが、右ページは左側に寄せて右側に( -gravity West )、 左ページは右側に寄せて左側に( -gravity East )余白を追加しないと、 見開きページとして設定した場合に、中央のつなぎ目の部分に余白が入ってしまうことになります。 そのためこのようなスクリプト(実際にはワンライナー)で偶数ページと奇数ページで右寄せ左寄せが変わるようにしました。

for i in `seq 2 51`; do
  p="West"
  if [ `expr $i % 2` -ne 0 ]; then
    p="East"
  fi
  f=`printf "%06d.jpg" $i`
  echo $f
  convert -resize 1440x2048 -strip -gravity $p -background black -extent 1440x2048 $f out/$f
done

以上でmobiファイルに使う画像データの用意ができました。

mobiファイルを作る

  1. Kindle Comic Creatorを起動して 新しい本を作成 を押します。
  2. 本のページ進行方向 は漫画の場合は 右から左へ のままでOKです。
  3. 本のページサイズ(画像の解像度) という入力欄に関しては、 ? ボタンを押すと説明が出ますが、 1280を最大値として、それを超える場合は縦横の比率を合わせた値を入力する。 とあります。 今回の場合、横と縦の比率は 1:1.42181280 / 1.4218 = 900.2672 となるため、 w: 900px, h: 1280px と設定します。

  4. 続ける を押して次のページへ進みます。 メタデータは適当に入力します。

  5. カバー画像 には表紙用に変換したファイル(000001.jpg)を指定します。
  6. 保存するディレクトリは適当に空のディレクトリを用意します。

  7. ページの追加を開始 を押します。

  8. ファイルを選択するダイアログが表示されるので、表紙以外のファイルを全て選択します。 選択したファイルが ブックマネージャ に追加されます。
  9. ページ設定全てを見開きページに設定 で見開きページの設定をします。 見開きページに設定しておくと、デバイスが横画面の場合に左右に並んで表示されます。 逆に見開きページに設定していてもデバイスが縦画面の場合は左右バラバラに表示されるみたいです。

  10. 見開きの設定やページ順が問題なさそうであればmobiファイルを生成します。 メニューバーの ビルド -> ビルド&プレビュー でmobiファイルの生成がはじまります。 ( ファイル -> KF8ブックとしてエクスポート でもよいですが、 保存先のディレクトリとファイル名を入力しなければいけないのでビルドのほうが楽です。) (生成が終わるとプレビューが起動するみたいなのですが、手元の環境では起動しませんでした…。) ビルドが終わるとはじめに設定したディレクトリにmobiファイルが生成されています。

デバイスへ転送

できたファイルをデバイスへ転送します。 何を使ってもいいのですが今回は Android File Transfer を使いました。

Android File Transferを起動してUSBケーブルでデバイスと接続すると Can't access device storage と言われるので一度閉じます。 この状態でデバイスの通知をみると この端末を USB で充電 と出ているはずなので ファイルを転送する に変更します。 すると、Android File Transferが使える状態で再度起動します。

Kindleが認識するパスは Android/data/com.amazon.kindle/files なので、ここへmobiファイルをコピーします。 コピーしたら、USBケーブルを抜いてKindleアプリを再起動すれば、追加したmobiファイルが見えるようになります。

最後に

ComittoNではjpegをzipで固めただけなので、ページの進行方向や見開きページに関する情報を持っていません。 そのためファイルを開く時に自分で設定しなければいけないのが少し煩わしいなと感じていました。 mobiファイルをKindleで開く場合はそういった煩わしさがないのでスムーズに読み始められそうです。 ファイルの作り方も流石にzipで固めるのと比べるのはかわいそうですが、 一度やり方がわかってしまえばほとんど手間はかからないので面倒くさくなってしまうこともなさそうです。 元のデータがそこそこ高画質だったためか画質も問題ないと感じたし、速度も遅いとは思いませんでした。

スペック的にKindle Paperwhite等のデバイスでも同じ感じで読めるのかがちょっと気になりますが、 今後新しい本を買うときはKindle版を買うことを検討しても悪くはないかもしれないなと思いました。