adbird(広告鳥) 備忘録

スマホ(Android)のTermuxでGraphicsMagick(or ImageMagick)を使って複数の画像を一括縮小

※最終更新 : 2019年12月11日。



僕は通話専用のガラケーと、データ通信専用の格安スマホの2台持ちなのだが、スマホの通信プランは月1GB+前月までの残通信量(最大1GB)=ひと月、最大2GBという少ない通信量である。まあ、そのおかげでガラケースマホで合わせて月1,500円程度のコストなのだが。

それでも自宅ではWifiだし、外では動画などの大きい容量のデータのダウンロードや閲覧はしないようにしているので、前月の通信量が結構残ることが多く、特に困ることはない。

しかし、外出先でスマホで撮った写真をツイッターとかでアップロードしたいときもある。その日のうちに自宅に帰れるのなら、自宅に戻ってからアップすることもあるのだが、帰省中などWifiがない場合やすぐにアップしたいときに、少ない通信量しかない僕のプランではスマホの画像データの容量もバカにならない…。

そこで以前は、画像をリサイズできるアプリを使って、1枚ずつ縮小してからアップしていたのだが、これが結構手間だった。 とくに1回の投稿で複数枚の画像をアップするときなど。

複数の画像を一括で縮小できるアプリもあるっぽいみたいだったが、ふと、「スマホでも端末(ターミナル)開いて、Imagemagick の mogrify で一括縮小できないかなぁ」と思って調べたら、Termux というAndroidLinuxコマンドが使える端末アプリがあるじゃないですか!!

そして、ついに比較的簡単(?)に複数枚の画像を一括縮小する環境を作ることができた。

準備編

Termux インストール

  • Termuxをインストール。

起動すると、こんな感じ。

f:id:adbird:20181229133957p:plain
Temux

おぉ、端末(ターミナル)だ!
とりあえず、下記のことをすべし。

$ pkg update
$ pkg upgrade
$ termux-setup-storage

最後のコマンドで「アクセスを許可しますか?」と聞かれたら、許可をする。

tree インストール

端末で困るのは、現在の自分の場所がどこなのか、自分がいる場所はどんなフォルダ・ファイル構成になっているのがわかりづらいこと。

自分の場所を知るには下記コマンドで分かる。

$ pwd

自分がいる場所のフォルダ・ファイル構成は $ tree で分かる。

$ pkg install tree

でインストールして、

$ tree

で、フォルダ構造が表示される。
後述するように、ファイルの確認でも使う。

GraphicsMagick インストール

お好みでGraphicsMagickまたはImageMagickをインストールする。

GraphicsMagickはImageMagickより画像変換速度が速い。ただし、本当かどうかは分からないが、画質はImageMagickの方がいいという情報も。

$ pkg install graphicsmagick

ImageMagick インストール

画像変換の定番といえばこれ。ただし、画像変換に時間がかかる。使わない場合はインストールする必要はない。

$ pkg install imagemagick

作業フォルダ(「画像リサイズ」) 作成

~/storage/pictures/ の場所が、スマホ内部のどこに当てられているかを確認。

$ tree

たぶん、「本体(内部) > Pictures」(/storage/emulated/0/Pictures)になっていると思う。

「本体(内部) > Pictures」内に移動して、「画像リサイズ」フォルダを作成、確認する。

$ cd ~/storage/pictures/
$ mkdir 画像リサイズ
$ tree -L 1

一応、スマホの適当なファイルマネージャーで「本体(内部) > Pictures」を開いて見たときと、上記の $ tree -L 1 で表示された構成と同じになっているか(「画像リサイズ」フォルダがあるか)を確認する。

ホームに戻る。

$ cd

スクリプトファイル作成

スマホの小さい画面の端末でいちいち $ cd で画像の入っている目的のフォルダまで移動してから一括縮小のコマンドを打つ、なんてことはしたくない。
termux を開いて、すぐにコマンド一発で縮小できるようにしたい!ということでスクリプトファイルを作成。

次の2つのスクリプトを作成(スクリプトの名前は任意でOK)。

  • resize.sh : スクリプトを実行するだけで、スマホのカメラで撮影した画像を縮小できる。ただし、縮小されるのは現在の日付の画像のみ
  • resize2.sh : ファイルマネージャーを立ち上げて、画像をその都度、手作業で移動させてからスクリプトを実行して、画像を縮小する場合。

resize.sh

スマホスクリプトを書いてもいいけど、キーボードを使えるパソコンで書いたほうが速いので、パソコンで作った。(Windowsの場合、文字コードUTF-8にしたほうがいいかも。) 今回は縮小サイズを50%とした。縮小割合はお好みで。

#!/data/data/com.termux/files/usr/bin/sh
cp ~/storage/dcim/Camera/IMG_$(date +%Y%m%d)_*.jpg ~/storage/pictures/画像リサイズ
cd ~/storage/pictures/画像リサイズ
gm mogrify -resize 50% *.jpg

内容はスマホの環境によってだいぶ変わると思うので、ご自身の環境に合わせて書き換えてください。

各行の説明は以下の通り。

  • cp ~/storage/dcim/Camera/IMG_$(date +%Y%m%d)_*.jpg ~/storage/pictures/画像リサイズ
    • ~/storage/dcim/Camera/ 内に入っている、現在の日時の入っている画像ファイルを、上述の「画像リサイズ」フォルダにコピー。
    • 僕のスマホはカメラで撮った画像が ~/storage/dcim/Camera/ の中に IMG_20191211_214724.jpg というような名前で保存される。つまり、画像ファイル名の真ん中が撮影した日付になっている。それを利用して、IMG_$(date +%Y%m%d)_*.jpg とすることで、現在の日付の画像ファイルだけを選んでコピーできる。
    • もし、画像ファイル名に日付が入らない場合は、このスクリプトは使えないかも…。
  • cd ~/storage/pictures/画像リサイズ
    • 「画像リサイズ」フォルダに移動。
  • gm mogrify -resize 50% *.jpg
    • GraphicsMagickで、そのフォルダ内にある画像をすべて50%縮小する。

※ ImageMagickの方を使う場合は、gm mogrify -resize 50% *.jpg のところを mogrify -resize 50% *.jpg にする。

resize2.sh

#!/data/data/com.termux/files/usr/bin/sh
cd ~/storage/pictures/画像リサイズ
gm mogrify -resize 50% *.jpg
  • cd ~/storage/pictures/画像リサイズ
    • 「画像リサイズ」フォルダに移動。
  • gm mogrify -resize 50% *.jpg
    • GraphicsMagickで、そのフォルダ内にある画像をすべて50%縮小する。

※ ImageMagickの方を使う場合は、gm mogrify -resize 50% *.jpg のところを mogrify -resize 50% *.jpg にする。

スクリプトを移動させる

作成した resize.sh をグーグルドライブ経由(べつにグーグルドライブでなくてもいい。メールで添付とかでも。)でスマホにダウンロードしたら、「Downloads」フォルダにあるはずなので、termuxでダウンロードフォルダに移動。

$ cd ~/storage/downloads

resize.shがあるかを確認。

$ tree

resize.sh、resize2.shがあることを確認したら、以下のようにresize.shとresize2.shを /bin フォルダにコピー。

$ cp resize.sh $PREFIX/bin/resize.sh
$ cp resize2.sh $PREFIX/bin/resize2.sh

実行権限を与える。

$ chmod +x resize.sh

(↑必要なかった?)

これで準備終わり。一度、termuxを閉じるか、$ cd でホームに戻る。

実行編

撮影した当日に画像を縮小する場合

(そもそもカメラで撮影した画像のファイル名に日付が入ることを前提に resize.sh を作成しているので、スマホによってはこの方法は使えない可能性もある。)

スマホのカメラで写真を撮った後、termuxを起動してスクリプトを実行。

$ resize.sh

実行中は何も表示されなくて不安になるけど、じっと待つw。

端末に再び「$」が表示されれば、「画像リサイズ」フォルダ内に縮小された画像が入っている。

Termuxをちゃんと

$ exit

で終了させれば、入力コマンドが履歴として残るので、次回からはTermuxを起動させて「↑」を押せば、すぐに $ resize.sh が実行できる。

撮影した翌日以降に画像を縮小する場合

ファイルマネージャー等で、スマホで撮った画像データを「画像リサイズ」フォルダにコピーする。

Yahoo!ファイルマネージャーが、目的のフォルダをスマホのホーム画面にショートカットとして置けるし、画面を2分割してドラッグ&ドロップできるし便利な感じ。

f:id:adbird:20181229125945p:plain

termuxを起動して、スクリプト実行。

$ resize2.sh

端末に再び「$」が表示されれば、「画像リサイズ」フォルダ内の画像が縮小されている。

繰り返しになるが、Termuxをちゃんと

$ exit

で終了させれば、入力コマンドが履歴として残るので、次回からはTermuxを起動させて「↑」を押せば、すぐに $ resize2.sh が実行できる。

僕の貧弱なスマホのスペックではわずか数枚の縮小にも結構、時間がかかった…。

あまり大量に一括縮小するのは時間がかかりすぎるので止めておいたほうがいいかも。

GraphicsMagickを使うことで変換時間が速くなった!