ImageMagick を使用する必要があります。PILには、探している量の画像機能がないためです。ただし、Pythonを使用したいです。
pythonバインディング(PythonMagick)は2009年以降更新されていません。見つけることができたのはos.system
コマンドラインインターフェイスを使用するように呼び出しますが、これは不格好なようです。
ctypes
と何らかの変換を使用してAPIに直接アクセスする方法はありますか?最後の手段として、ImageMagickのような大量の画像編集ツールを備えた他のライブラリがありますか?
Wand を使用することをお勧めします(説明が続きます)。
ImageMagickライブラリへの適切なバインディングを探していました。
しかし、実際にはpython API(バインディング)には非常に多くの異なる(ほとんど廃止された)バージョンがあります。 (彼の github wiki も参照):
WandはImageMagickの(縮小)C APIです。APIは、Cプログラミング言語とImageMagick画像処理ライブラリ間の推奨インターフェースです。MagickCoreC APIとは異なり、MagickWandはいくつかの不透明な型のみを使用します。重要な杖のプロパティを設定または取得します。」 ( プロジェクトのホームページを参照 )
そのため、保守が簡単なシンプルなインターフェイスになっています。
良い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ストリームを使用するように指示できます。
これは、文字「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)