the invention of t88

工作、資格取得、データ分析のことなど

ジェンティリナグリーン収穫+GIF作成

水耕栽培器のジェンティリナグリーンは順調に育ち、先日遂に収穫を迎えました。

f:id:take213uv:20190210154945j:plain

f:id:take213uv:20190210155001j:plain

さて、IoT水耕栽培器ということで、30分ごとにラズパイカメラで写真を撮り、google driveに蓄積していました。今回は、これを繋ぎ合わせて成長の様子を表すGIFを作成したいと思います。

python + pillowでjpgをgif化する

gif作成にはpythonのpillowを使います。

基本的には、これでgifが作成されます。

from PIL import Image
import pathlib

p = pathlib.Path('201901_ジェンティリナグリーン')
files = sorted(list(p.glob('*jpg')))
images = list(map(lambda file: Image.open(file), files))
images[0].save('201901.gif',save_all=True, append_images=images[1:], optimize=False, duration=40, loop=0)

pathlibでjpgのパスを掴んでpillowでgifにして保存。
 

ただ、何も考えずに30分おきに取得した画像をgif化すると中々の容量になります。今回のケースだとおよそ500MB。容量削減が必要。

 

gifの容量削減

まず解像度を1024×768から512×384に下げます。

次に、jpgファイルを間引きます。22時から6時は水耕栽培器が消灯しているので、画像も真っ黒。この期間は使わなくて良い。さらに時間間隔も粗くします。色々試しましたが、1日数枚程度でも割と育ってる感は出るみたい。

pythonスクリプトを修正。

from PIL import Image
import pathlib

p = pathlib.Path('201901_ジェンティリナグリーン')
files = sorted(list(p.glob('20190???0700*.jpg')) + 
               list(p.glob('20190???1[3,9]00*.jpg')))
images = list(map(lambda file: Image.open(file).resize((512,384)), files))
images[0].save('201901_圧縮版.gif',save_all=True, append_images=images[1:], optimize=False, duration=20, loop=0)

jpgファイル名がタイムスタンプなのでpathlib globのパターンマッチング条件で対象のファイルを絞り込んでいる。   これで容量は20MB程度まで減少。

 

さらに

ezgif.com

を使って圧縮。

変化のない部分を透明化したり、色数を削減して圧縮を行う。

これで8MB程度まで容量削減。

なんとかはてなブログにあげられる程度まで容量が削減できました。

完成したGIF

f:id:take213uv:20190213010235g:plain

若干怖い...。でもなんだか面白い。

今後の予定

中々面白いので引き続き、色んな植物を育ててみます。
次は水菜。

温度、湿度、CO2のデータは今のところ特に使い道がない...。

参考資料

Python PillowでPNGからGIFを作る - Qiita
GIFアニメを90%圧縮 – てまりのUXブログ