2011-12-05(月) [長年日記]
■ BOOKSCANから巨大なPDFが届いたので圧縮した
蔵書をBOOKSCAN送りにするのも今月で3回目、だいぶ書庫の本棚に隙間が見えてきた。
で、おれの場合、納品されたPDFはあらかじめ自宅でスキャンしておいた表紙を連結してメタ情報を追加してから補完しているのだけど、今回は2冊ほど、1GB近いサイズの巨大なPDFが含まれていて、メモリ不足でその手の作業ができない。どうやら、古くて紙が黄ばんだ本はスキャナがカラー原稿と認識してしまうためらしい。どっちも500ページ程度の文庫本なのにこれはたまらん。
というわけで、軽くグレースケール化してから再パッケージすることにした。ちなみに最近Koboを買ったかずひこから「pdfimages」というコマンドがあるよと教えてもらったので、今回からそれを使ってみることにした:
% mkdir ppm png pdf % pdfimages `basename $PWD`.pdf ppm/tmp % for f in ppm/*; do echo $f; convert $f -type Grayscale `echo $f|sed "s/ppm/png/g"`; done % for f in png/*; do echo $f; sam2p -j:quiet -c:jpeg $f `echo $f|sed "s/png/pdf/g"`; done % pdftk pdf/* cat output `basename $PWD`.out.pdf
これでファイルサイズが1/6くらいになった。モノクロにするともっと小さくなるけど、これはいちおう原本なのでそこまでは追い込まない。
ところで、pdftoppmはページ番号を1から始めるのに、なんでpdfimagesは0から始めるのかねぇ。併用しにくくて困るではないか。
■ Kindlizerもpdfimagesを使うようにしてみた
↑の状況をみて、Kindlizerでもpdftoppmの代わりにpdfimagesを使うようにしてみた。
pdfimagesはフルカラーのppmファイルを吐くし、おまけにファイル名の通し番号がゼロオリジンということもあって、環境に応じてpdftoppmと使い分けるという目論見はさっくりあきらめた。ということで、フルカラーの元画像をどのようにKindle向けに最適化するかという新たな課題が浮上する。というか前からそのあたりをもうちょっと詰めてみたかったのだけど。
まずは、ppm→pngにする段階で、グレースケールにするようにしてみた。何も考えないと255階調になるんだけど、-levelオプションを調整してみたり、16階調(KindleのE Inkがこれ)に変えてみたりしてもあまり最終的なサイズに変化がないので手詰まり。今日はこんなところで。
ちょっと試してみたけれど、最終を4-bit grayにするのなら、sam2pでJPEG圧縮しないほうが、ノイズが増えないのは当然として、しかも出力ファイルサイズも小さくなりそう(入力に含まれるノイズの度合いによるだろうけど)。convertの引数に"-depth 4"を足して、sam2pの引数から"-c:jpeg"を抜いて試してみてください。
軽く-depth 4を追加して試してみたらものすごく画質の低いpngができてしまったので、なにか他にもチューニングの要素がありそう。もうちょっと腰を落ち着けて試してみる。-levelのせいかなぁ。
自分の場合は、Kindleで読みたい時は解像度を倍にした上で2値化してGroup4圧縮としています。綺麗にとは行かないですが、ImageMagickが標準で勝手にディザリングしてくれるので字はくっきり読めて、写真もそれなりに見られる絵になります(ダメな時は全然ダメですが)。ファイルサイズはScanSnapの圧縮率3のカラーJPEGから1/4から1/5ぐらいでしょうか。
1/4~1/5だとGmailからPersonal Documentに送れるようになる感じですね。やっぱ二値化も視野に入れるべきかなぁ。
私はモノクロドキュメントは適当にレベル調整の上、4値化=2bitPNGで保存しています。
どうも-depthオプションは意図した処理にならない気がするので-colors 4として変換しています。
16階調ならば-colors 16 とするのはどうでしょうか。
-depth 4がおかしいのは古いImageMagickのバグでした。同じように(?)-colorsもうまく動かないんですよね、ウチ。ということで、野良ビルドしたImageMagickを使って最適化してみました!
→ http://sho.tdiary.net/20111208.html#p01
-colors 16は、あくまでもカラーパレットを16色に減色するのであって、等間隔に離れた16階調のカラーパレットにするのではないので、結果をPCでみても16階調の端末での見た目をシミュレートできるわけではありません。ImageMagickの"identify -verbose"で見てみると、-depth 4の場合は、#111111, #222222, ...みたいなパレットなのに対し、-colors 16だと、#161616みたいな中間色が使われているのが分かると思います。
問題の方は無事解決したようで何よりでした。
-colorsオプションの件、かずひこさんご指摘のとおりで失礼いたしました。
自分の環境がカラー液晶向け用途で問題にはならなかったもので、、、