Symfoware

Symfowareについての考察blog

Python3 subprocess + ImageMagick convert プログラム中のバイナリデータを変換

Python3 + subprocessからconvertコマンドを呼び出して画像を変換してみました。
Python3 subprocess + ImageMagick identifyで画像のexif情報を取得する
Python3 subprocess + ImageMagick convertで画像のリサイズやトリミングを実行

変換元や変換先はファイルに出力されます。
例えば、プログラム中でネットワーク上の画像データを取得。
そのデータをリサイズしたい時、ファイルに出力せずバイナリデータを直接変換したい。


標準出力と標準入力



imageMagickのconvert で標準入出力 stdout/stdin を使う


$ command | convert - -option arg - | command



ハイフンを使用して、標準出入力を制御してやれば良さそうです。

試しに、こんなコマンドを実行。


$ convert cc2.jpg -resize 100x100 cc2-resize.jpg




この形でも同様の結果が出力されました。


$ cat cc2.jpg | convert - -resize 100x100 - > dst.jpg








stdinとstdout



https://docs.python.jp/3.5/library/subprocess.html

subprocess.runするときの、stdinとstdoutに画像データを指定すれば良いのではないか。

https://docs.python.jp/3.5/library/subprocess.html
こちらを参考にプログラムを書いてみました。


  1. # -*- coding:utf-8 -*-
  2. import io
  3. import subprocess
  4. # 画像のバイナリデータ取得
  5. with open('cc2.jpg', 'rb') as f:
  6.     img = f.read()
  7. # 変換コマンドを用意
  8. proc = subprocess.Popen(['convert - -resize 200x200 -'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
  9. # 標準入力にバイナリデータ書き込み
  10. # 結果を受け取る
  11. outs, errs = proc.communicate(img)
  12. # 確認のため、結果をファイルに出力
  13. with open('cc2-resize.jpg', 'wb') as o:
  14.     o.write(outs)




これでうまく変換できました。
ファイルに出力せず画像の変換が行えそうです。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2017/08/11(金) 18:23:39|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Python3 別途ライブラリをインストールせず、ImageMagickを使用するpymraw | ホーム | Python3 subprocess + ImageMagick convertで画像のリサイズやトリミングを実行>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/2021-e6220044
この記事にトラックバックする(FC2ブログユーザー)