memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

また、つまらぬ物を作ってしまった。。。

リアル本を裁断せずに自炊しまして。。。昔はよくやってたんですが最近はほとんどやらなくなりました。最初から電子書籍を買うからですね。。。今回は紙の方が読めるかと思って買ったもののやはり「厚い」「重い」そして写経とかするときに押さえが必要だったり。。。やはり電子書籍の方がいいですね。。。

Canon EOS Kiss X90をドキュメントスキャナーにしてみた - memorandums

せっかくスキャンしたのですが見開きになっていてスマホではとても読みにくいのです。。。つづら折りみたいに→↙︎→↙︎ということを繰り返さなければならないので。。。

しかも、スキャンが下手なので画像内の書籍位置がページが進むにつれてずれていくんですね。。。作成した見開きPDFを単一ページにするスクリプトを以前作ったことがあったのですが、位置ずれは対応していないので使えません。

自炊等をした見開きページのPDFファイルを単一ページに分割して統合するスクリプト(mac用) - memorandums

どうにかならないかな。。。と思っていたんです。AutoCropってのもあるようですがそれほど鮮明ではないし普通にスキャンしたので単なる画像処理では無理があるようでした。YOLOとか使ってどこか本の角とか中央線とか検出すれば、本の面積はだいたい同じなので作れそうに思いましたが面倒なのでやっていません。。。

とりあえずPythonで画像をクロップするコードをネットを見ながら書いてみて、これならこんな感じで補正項をいれればなんか行けそうな気もするな。。。という感じで対処療法的なスクリプトができあがりました。

それこそ、昨日、授業で学生らに話したマジックナンバーを使いまくっている。。。しょうもないコードです。一応、コメントを入れておきました。見開きの画像ファイルがあるとします。

from PIL import Image

for i in range(1,279): #ページ数
    a = f'a/{i}.jpg' #変換前の画像ファイル名
    b_l = f'b/{i}_l.jpg' #変換後
    b_r = f'b/{i}_r.jpg'

    try:
        im = Image.open(a) #画像ファイル読み込み(不鮮明な画像を削除すると連番が崩れるので例外処理をいれてます)
    except Exception:
        continue

    h = -i * 2 #対処療法:ページが進むにしたがってクロップ水平位置を補正する項です
    if i > 150:
        h = - i
    elif i > 190:
        h = 200 - i

    x1 = 400 + h #クロップの左端の水平座標
    x2 = (im.width / 2) + h #クロップの中央の水平座標
    x3 = (im.width - 400) + h  #クロップの右端の水平座標

    im_crop_l = im.crop((x1, 200, x2 + 100, im.height)) #200と100は上下のクロップ位置です、クロップ画像をみて調整します。垂直方向の位置は安定していたのでこれでいけました
    im_crop_r = im.crop((x2 - 100, 200, x3, im.height))

    im_crop_l.save(b_l, quality=75)
    im_crop_r.save(b_r, quality=75)

画像が生成されたら、あとは、Macであれば画像ファイルを全選択して右クリックして「PDFを生成」をすればPDFファイルができます。

今回は87MBくらいになりましたので、Google Play Bookにアップロードできました(100MB以上はアップロード不可のため)

独り言:学生さんと話しているとプログラミング好きって人になかなか出会うことがありません。。。日常業務や日常生活を少しでも楽にできるツールなんですけどね。。。教え方が悪いのかなぁ。。。やりたくないけど IT 企業に就職したい、学生の時にそう言いたい気持ちはよくわかるんです。でもなんかモヤモヤするんですよね。

なんかよくわからんけど難しい→でも頑張ってやってみた→そのうちに何か面白くなってきた、こういうジャンプ的な展開って現実では起きにくいんですかね。

月並みですが、社会人になって自分がやらなければならないというにおかれて、案件とお金を目の前にして 真剣勝負する、どこから得られる 達成感、社会人にならないとそういう感覚は得にくいんだろうな と想像します。

🔳追記

講義が終わって、考えてみればPillowならPDF生成もできるのでは?と思って調べたらすぐ見つかった。ありがたい。

画像をPDFにまとめる方法|Python×Pillowで初心者でもできる簡単コード | スクラムとは 仕事が進まなく技術力もないリーダーのごっこ遊び

早速、真似して組み込んだのが以下。PDFのサイズもMacで生成したのと同じだった。これでいいじゃん。。ただ、繰り返しの位置調整が必要なのでPDFにするのは上のようなコードで確認したあとかと思います。

やっぱPythonは便利ですよね。。。Pythonがというよりやはりライブラリが優秀。一時期のグルー言語としてのJavaと似ています。何かやろうとしたときに答えがすぐに見つかります。しかもコードは数行でよい。いいですね。

from PIL import Image

ims = []

for i in range(1,279): #ページ数
    a = f'a/{i}.jpg' #変換前の画像ファイル名

    try:
        im = Image.open(a).convert("RGB") #画像ファイル読み込み(不鮮明な画像を削除すると連番が崩れるので例外処理をいれてます)
    except Exception:
        continue

    h = -i * 2 #対処療法:ページが進むにしたがってクロップ水平位置を補正する項です
    if i > 150:
        h = - i
    elif i > 190:
        h = 200 - i

    x1 = 400 + h #クロップの左端の水平座標
    x2 = (im.width / 2) + h #クロップの中央の水平座標
    x3 = (im.width - 400) + h  #クロップの右端の水平座標

    ims.append(im.crop((x1, 200, x2 + 100, im.height))) #200と100は上下のクロップ位置です、クロップ画像をみて調整します。垂直方向の位置は安定していたのでこれでいけました
    ims.append(im.crop((x2 - 100, 200, x3, im.height)))

ims[0].save("output.pdf", save_all=True, quality=75, append_images=ims[1:])