書籍を裁断し、自宅のスキャナ(Canon MF249)でスキャンした画像(ファイル名連番のjpgファイル)からスキャンした画像の余白を取り除く作業をしたので、その時のメモです。
書籍の裁断
書籍の裁断近くにあるKinkosで行ってもらいました。裁断の依頼にかかる費用は書籍の厚さ1cmあたり100円で、今回は1cmをわずかに超えるので220円でした。
macにImageMagickをインストール
今回はjpg画像の加工にImageMagickコマンドを使うことにしました。ImageMagickは画像のクリッピング・加工などを非対話のcliから行うことができます。
ImageMagickコマンドは、brewコマンドでmacOSへインストールします。
brew install imagemagick
インストールできたか確認します。convert --version
でバージョンを確認できます。
$ convert --version
Version: ImageMagick 7.0.10-24 Q16 x86_64 2020-07-18 https://imagemagick.org
Copyright: © 1999-2020 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(3.1)
Delegates (built-in): bzlib freetype gslib heic jng jp2 jpeg lcms lqr ltdl lzma openexr png ps tiff webp xml zlib
処理するjpgファイルの情報を取得する
作業に先立って最初に変換前ファイルの形式を確認しておきます。macOSだとfile
コマンドを使うのが便利です。
$ file 1.jpg
1.jpg:
JPEG image data, JFIF standard 1.01, aspect ratio, density 120x120, segment length 16,
Exif Standard:
[TIFF image data, big-endian, direntries=6, model=Canon MF240 Series,
orientation=upper-left, xresolution=106, yresolution=114,
software=Apple Image Capture],
baseline, precision 8, 992x1403, components 1
この情報から、以下のことが読み取れます。
- スキャン解像度
- density 120x120
- 使ったスキャナ
- model=Canon MF240 Series
- 画像サイズ
- 992x1403
今回はA4の書籍(21x29.8cm)を120dpiをスキャンしています。当然ですが計算すると確かに画像サイズが一致しました。
- 21 * (120/2.54) = 992
- 29.7 * (120/2.54) = 1,403
jpgファイルを1つ変換してみる
今回処理したい書籍は全部で140ページほどあるのですが、動作確認として1ファイルだけ変更してみます。convertコマンドの中から下記のgravity,crop,quality,trimオプションを使用します。
$ convert -h
Version: ImageMagick 7.0.10-24 Q16 x86_64 2020-07-18 https://imagemagick.org
Usage: convert [options ...] file [ [options ...] file ...] [options ...] file
Image Settings
-gravity type horizontal and vertical text placement
-crop geometry cut out a rectangular region of the image
-quality value JPEG/MIFF/PNG compression level
-trim trim image edges
今回は左上の位置を基準に、切り出し開始位置+サイズを指定することにしました。何回か試行錯誤したところ下記の位置での切り取りが今回のjpgファイルに合っているようでした。
- 切り出し位置
- 左から100px、上から80px
- 切り出すサイズ
- 幅840px、高さ1200px
以下のコマンドで、上記の位置での切り取りを行うことができます。切り取り後のファイル名は一旦1_out.jpgとしておきます。
convert -gravity northwest -crop 840x1200+100+80 1.jpg 1_out.jpg
コマンドを実行後、生成された1_out.jpgを再度fileコマンドで確認します。840x1200にサイズがかわっていることがわかります。
$file 1_out.jpg
1_out.jpg:
JPEG image data, JFIF standard 1.01, aspect ratio, density 120x120, segment length 16,
Exif Standard:
[TIFF image data, big-endian, direntries=6, model=Canon MF240 Series,
orientation=upper-left, xresolution=106, yresolution=114,
software=Apple Image Capture],
baseline, precision 8, 840x1200, components 1
今回スキャンした書籍は文字中心で、もう少し画質を落としても大丈夫そうだったので-quality
オプションでクォリティを80%まで落としました。また、使ったスキャナ情報などの情報も不要なので-trim
で削除しておきます。
convert -gravity northwest -crop 840x1200+100+80 -quality 80 -trim 1.jpg 1_out_trim.jpg
コマンド実行後にファイルサイズを取ると、それぞれ272, 260, 180Kbyteとなっており、ファイルサイズも2/3にすることができした。
% ls -lh 1.jpg 1_out*
-rw-r--r-- 1 272K Jun 28 20:23 1.jpg
-rw-r--r-- 1 260K Jul 26 16:21 1_out.jpg
-rw-r--r-- 1 180K Jul 26 16:26 1_out_trim.jpg
他のページも見たところ、今回の書籍は偶数ページと奇数ページで余白のとり方が異なっており、それぞれ下記の値でした。
- 切り出し位置(奇数ページ)
- 左から100px、上から80px
- 切り出し位置(偶数ページ)
- 左から60px、上から170px
前ページまとめてトリミングする
今回スキャンした書籍は全部で139ページあり、また偶数ページと奇数ページで処理が異なっており手作業でコマンド実行すると面倒なので、全ページ処理するための小さなスクリプトを作成しました。
今回はphpで作成しています。
# crop.php
<?php
# 全部で139ページ
foreach (range(1, 139) as $page) {
$offset = ($page % 2 == 0) ? '+60+170' : '+100+80';
printf(
"convert -gravity northwest -crop 840x1200%s -quality 80 -trim %d.jpg ../out/%d.jpg%s",
$offset,
$page,
$page,
PHP_EOL
);
}
上記のスクリプトはconvertコマンドの羅列を出力するので、下記のように実行します。
php crop.php > run.sh
mkdir ../out
bash run.sh
これで全ページ分、スキャンした書籍から余白をトリミングしたものを作成することができました。
余白がなくなることでスマートフォンなどで閲覧するときに、大きな文字で閲覧することができ、取り回しが便利になりました。