[Python] Instagramのグリッド投稿用に画像を分割させる

2021/10/19に公開

はじめに

Instagramのプロフィールページで、1枚の画像が複数のマスに分割されている投稿を見たことはありますか?
これは、グリッド投稿と呼ばれているテクニックです。

先日、個人開発カメラアプリを公開しました。このカメラアプリの特徴を表現するため、インスタ上で画面に収まりきらないほどのグリッド投稿がしてみたいと思いました。

しかし、グリッド投稿を行うには1枚の画像を複数にクロップする単純作業が必要になります。

そこでPythonでグリッド投稿用に画像を分割させるコードを書いたので、紹介したいと思います。

グリッド投稿の例 @slicetimecam

映像が伸びて見えるようなカメラアプリなので、その特徴を画面いっぱいに表現するため27(縦9*横3)グリッドに分割してみました。
Aug-09-2021 14-08-12
Aug-09-2021 14-08-12

実装

  • ffmpegを利用しているため、pip install ffmpeg-python が必要になります。
insta_grid_out.py
import sys
import ffmpeg

args = sys.argv

file = args[1]
row = int(args[2])
col = int(args[3])

print(file)
stream = ffmpeg.input(file)

probe = ffmpeg.probe(file)
image_info = next(s for s in probe['streams'] if s['codec_type'] == 'video')

iw = int(image_info['width'])
ih = int(image_info['height'])

for r in range(row):
    for c in range(col):
        stream = ffmpeg.input(file)
        stream = ffmpeg.crop(stream,iw/col*c,ih/row*r,iw/col,ih/row)
        stream = ffmpeg.output(stream, 'out'+str(r)+'_'+str(c)+'.jpg')
        ffmpeg.run(stream)

準備

事前に、グリッド投稿用の元画像サイズを整える必要があります。例えば、3つのグリッド(縦1横3)に分割したい場合、サイズが1:3になるようにし、6つのグリッド(縦2横3)にしたい場合は、サイズが2:3になるようにします。

上記の27(縦9*横3)グリッドの場合は9:3の、高さ1920px:幅640pxの画像を準備しました。
Aug-09-2021 14-08-12

実行

# python insta_grid_out.py {元画像のファイルパス} {縦 分割数} {横 分割数}
python insta_grid_out.py input.png 9 3

結果

分割された画像が生成されます。左上から順にナンバリングされているので、投稿する際は右下から行うと、グリッド投稿ができると思います。
Aug-09-2021 14-08-12


最後に

画像のファイル数が多いと、投稿も大変です。
Instagramは2021年10月現在、PCから投稿ができないため、Chromeのデベロッパーツールからモバイル表示にして投稿すると便利です。カスタムファイルとしてJPEG形式が指定されていたので、上記コードではJPEGに指定して書き出しています。

良いInstagramライフをお送りください!

Discussion