コンピュータ

HEIC形式からJPEG形式へPythonで処理して画像圧縮

投稿日:

iPhoneから取り込んだ写真がHEIC形式なので、ブログにアップするときに困ります。1つ2つならプレビューを使って手動変換すればいいのですが、数が増えてくると面倒です。ついでに画像圧縮もやってくれると便利です。以下、Mac限定です。

画像フォーマットの変換はsipsを使えばいいようです。
https://qiita.com/1coin178/items/83098b1be474db3e8bda

sipsがいるかどうか調べて見ると、

$ which sips
/usr/bin/sips

なので、すでにシステムにインストールされていました。

JPEG画像の圧縮は、jpegoptimを使えばよさそうです。
https://do-zan.com/mac-easy-compress-jpeg-files/

jpegoptimは、システムに入っていないので、Homebrewで入れることにしました。

$ brew install jpegoptim
...
$ which jpegoptim
/usr/local/bin/jpegoptim

これで使えそうです。

1つ1つの画像を1つ1つターミナルで処理するのは手間なのでバッチ処理を考えます。最初は使い慣れているPerlを使おうかと考えたのですが、ここはやはり流行りのPythonでやってみることにしました。以前、1度だけPythonを触ってWebスクレイピングをやったことがあります。初めてPythonに触って、試行錯誤して、半日で実用的なスクリプトが書けたので驚きました。これは流行るわけだ。

ディレクトリ内のファイル一覧を確認するときはosモジュールが便利です。

【これでバッチリ!】Pythonのosモジュール使い方まとめ

スクリプト内からコマンドを実行するときはsubprocessモジュールが便利です。

【Python入門】subprocessを使ってコマンドを実行しよう!

簡単なスクリプトでエラーが出て驚きました。何とPythonではインクリメントに++が使えないのですね。i+=1。不便。
https://qiita.com/motokitsu/items/0e1cf895252b63e0b4e5

初めに変換したい写真を./heicにおきました。ファイル名がIMG_4159.HEICみたいな感じだったのでリネームすることにします。また、JPEGファイルをおくディレクトリ./jpegも作ります。

$ mkdir ./jpeg

スクリプトは次のとおりです。ファイル名はheic2jpeg.pyとしました。

import os
import subprocess

heicdir = './heic/' # HEIC形式の写真があるディレクトリ
jpegdir = './jpeg/' # JPEG形式の写真があるディレクトリ
files = os.listdir(heicdir)
i = 1

for f in files:
        cmd = 'sips --setProperty format jpeg ' + heicdir + f + ' --out ' + jpegdir + 'photo-' + str(i) + '.jpeg'
        subprocess.call(cmd, shell=True)
        i+=1

$ python3 heic2jpeg.py

次にjpegoptimで圧縮します。さしあたり950KB程度に圧縮することにしました。スクリプトのファイル名はjpegoptim.pyとしました。

import os
import subprocess

jpegdir = './jpeg/' # JPEG形式の写真があるディレクトリ

files = os.listdir(jpegdir)

for f in files:
        cmd = 'jpegoptim -S950 ' + jpegdir + f
        subprocess.call(cmd, shell=True)

$ python3 jpegoptim.py

これで任務完了です。まとめて1つのスクリプトにすることもできますが、タスク1つにつき1つのスクリプトがわかりやすいかと。

-コンピュータ

Copyright© keejaiva.net , 2019 All Rights Reserved Powered by AFFINGER5.