web-dev-qa-db-ja.com

PythonでImageMagick APIにアクセスできますか?

ImageMagick を使用する必要があります。PILには、探している量の画像機能がないためです。ただし、Pythonを使用したいです。

pythonバインディング(PythonMagick)は2009年以降更新されていません。見つけることができたのはos.systemコマンドラインインターフェイスを使用するように呼び出しますが、これは不格好なようです。

ctypesと何らかの変換を使用してAPIに直接アクセスする方法はありますか?最後の手段として、ImageMagickのような大量の画像編集ツールを備えた他のライブラリがありますか?

45
bsktball11ch

Wand を使用することをお勧めします(説明が続きます)。

ImageMagickライブラリへの適切なバインディングを探していました。

  • 作業エラー/問題なし
  • 定期的に維持され、最新のものである
  • ニースの客観的なPythonを許可する

しかし、実際にはpython API(バインディング)には非常に多くの異なる(ほとんど廃止された)バージョンがあります。 (彼の github wiki も参照)

  • グラフィックスマジック
  • PythonMagick-最初の実装
  • PythonMagickWand/Achim Domma-最初の杖-CDLLの実装
  • PythonMagickWand/Ian Stevens
  • MagickFoo-python-magickwandに含まれています
  • ワンド/ホン・ミンヒ-最新プロジェクト

WandはImageMagickの(縮小)C APIです。APIは、Cプログラミング言語とImageMagick画像処理ライブラリ間の推奨インターフェースです。MagickCoreC APIとは異なり、MagickWandはいくつかの不透明な型のみを使用します。重要な杖のプロパティを設定または取得します。」 ( プロジェクトのホームページを参照

そのため、保守が簡単なシンプルなインターフェイスになっています。

64

良いPython ImageMagickのバインディングが見つからなかったので、ImageMagickを使用するためにPythonプログラムはsubprocessモジュールを使用して入力をリダイレクトしなければなりませんでした/出力。

たとえば、PDFファイルをTIFに変換する必要があると仮定します。

path = "/path/to/some.pdf"
cmd = ["convert", "-monochrome", "-compress", "lzw", path, "tif:-"]
fconvert = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = fconvert.communicate()
assert fconvert.returncode == 0, stderr

# now stdout is TIF image. let's load it with OpenCV
filebytes = numpy.asarray(bytearray(stdout), dtype=numpy.uint8)
image = cv2.imdecode(filebytes, cv2.IMREAD_GRAYSCALE)

ここでは、tif:-を使用して、ImageMagickのコマンドラインユーティリティに、TIFイメージをstdoutストリームとして取得するように指示しています。同様に、入力ファイル名として-を指定することにより、入力としてstdinストリームを使用するように指示できます。

3
Maksym Ganenko

これは、文字「P」のテキストから画像を作成する次のコマンドで機能しました。

import subprocess

cmd = '/usr/local/bin/convert -size 30x40 xc:white -fill white -fill black -font Arial -pointsize 40 -gravity South -draw "text 0,0 \'P\'" /Users/fred/desktop/draw_text2.gif'

subprocess.call(cmd, Shell=True)
0
fmw42