【Mac】漫画サイトでスクリーンショットを撮る

無料で公開されている漫画をブラウザで表示して、そのスクリーンショットを撮る、という行為は著作権に抵触するだろうか。
 2019 年 2 月ごろ、著作権法の改正案が物議をかもした。
 その改正案では、スクリーンショットも違法となるとのこと。
 ただ、細かく見ると、

  • 雑誌や書籍のページが掲載された個人ブログ画面のスクリーンショット

が禁止されるらしい。
 これだと、公式に発表されている漫画のスクショは OK に思えてしまう。
 スクショで撮った画像を、ネットにアップするのは間違いなく違法だ。
 しかし、個人利用の場合はどうなるんだろう。
 まぁたぶん、あまり感心はされない行為なんだろう。

ということで、漫画のスクショを撮る

著作権法を侵害する目的でなく、あくまで実験として漫画のスクショを効率良く撮る方法を考えたい。
 なにがともあれ、Hammerspoon を利用する。
 スクリーンショットのキーボード・ショートカットは、コマンド + シフト + 3 である。スクリーンショットは png 画像でデスクトップに保存される。

ブラウザは safari を使うと想定し、さらに全画面表示にして、デスクトップいっぱいに広げる。その画面全体のスクリーンショットを撮る、としよう。
 さらに目標とする漫画は、左の矢印キーを押すことでページめくりされる、と仮定する。

init.lua

以下のようになるかと思う。
 キーバインドを ctrl + cmd + ← とした。

hs.hotkey.bind({"ctrl","cmd"}, "left", function()
    hs.execute("screencapture ~/Desktop/sc`date +%s`.png")
    hs.timer.doAfter(0.5, function()
        hs.eventtap.keyStroke({}, "left", 0)
    end)
end)

Mojave になってから、スクリーンショットを撮影すると、右下にサムネイルみたいなのが出てくるようになった。このサムネイルは 5 秒くらいたってから消える。サムネイルを表示したままスクリーンショットを撮ると、当然、サムネイルも写ってしまう。
 しかしながら 5 秒も待つのはいかにもダルい。
 
 幸い Mac にはその名も screencapture というスクリーンショットのコマンドがあるので、それを利用する。このコマンドを使えば、右下のサムネイルは表示されない。
 hammerspoon でコマンドを実行するには、hs.execute というのを使うようだ。
 date +%s は UnixTime を表示するコマンド。ファイル名に使う。

hs.timer.doAfter(0.5 というのは、0.5 秒たってからなにかやる、という意味だ。
 ここでは、0.5 秒後に、左キーを押してページめくりする、ということになる。

余白の切り取り

デスクトップに保存されたスクリーンショットを、ひとつのフォルダに集め、そのフォルダを cooViewer などにドロップすれば、漫画が読めるはずだ。
 でもどうせなら、漫画の部分だけを切り取りたい、という欲も出てくる。
 safari を全画面表示しているなら、切り取るべき漫画の座標はすべてのページで同じ、ということになるだろう。シェルスクリプトで自動化できそうだ。
 画像の切り抜きは、imageMagick を使えば、柔軟におこなえる。
 が、ここでは標準でインストールされている、sips を使用する。

撮影したスクリーンキャプチャをフォルダに入れて、crop.sh フォルダという具合に使用することを考えている。

📝 crop.sh

#!/bin/bash

if [ -d "${1}" ]; then
    folder=$1
else
    read -p 'フォルダをドロップ:' folder
    if ! [ -d "${folder}" ]; then
        exit 0
    fi
fi

cd "${folder}"
mkdir 'cropImage'
i=1

IFS_BACKUP=$IFS
IFS=$'\n'
for file in $(ls .);
do
    if [ -f "${file}" ]; then
        sips -c 高さ 幅 "${file}" --out cropImage/p"$i".png
        i=`expr $i + 1`
    fi
done
cd cropImage
for png in $(ls .);
do
    pngquant --ext .png --force "${png}"
done
IFS=$IFS_BACKUP

sips のクロップは中心を基点にして、切り取るべき幅と高さを指定する。
 画像の中心から上 20 px 下 20px、右 50px 左 50px 分を切り抜きたいとする。
 sips では以下のように書く。

sips -c 40 100 ファイルパス/イメージ.png

つまり、上へ何ピクセル、下へ何ピクセルと、というような細やかな指定はできない。縦なら「縦 100 ピクセル」というように、ひとつの数値しか設定できない。
 これは、切り抜く範囲が上下で同じでなくてはならない、ということを意味している。

safari の「表示」メニューに、「フルスクリーンで常にツールバーを表示」という項目があるので、それのチェックを外しておく。すると、切り取るべき上下の高さが、中心に対して同じになるはずだ。

また、スクリーンキャプチャされた画像はファイルサイズが糞デカいので、pngquant というコマンドを使用することにした。
 pngquant は png イメージの画質をそこなわず、ファイルサイズを小さくしてくれる、というものだ。Homebrew で簡単にインストールできる。

brew install pngquant

基本、pngquant ファイルパス/イメージ.png を実行するだけで、サイズの小さい png ファイルを新たに生成してくれる。

こうして切り抜いたイメージファイルを zip にするなり pdf にするのが良いと思う。もっとうまいやり方がありそうではあるが、まぁひとまず。