1

PythonMagickWandを使用して、画像にシェパード歪みを使用しようとしています。また、ImageMagickで使用されている味付け.cのソースを確認することもできます。

PythonMagickWandは、デフォルトではシェパード歪みをサポートしていません。これを修正するために、私は以下を追加しました:

ShepardsDistortion = DistortImageMethod(15)

PythonMagickWandの544行目(変更されたPythonMagicWandについてはこちらを参照してください)。15ポインターは、ShepardsDistortionがリストの15番目の項目であるMagickWandソースのcompress.h(51行目)を参照しています。これは、サポートされている他のすべてのディストーション方法に適合します。

さて、私が間違っているかもしれないことは、PythonMagickWandでサポートされている既存の歪みメソッドがシェパードと同じタイプの引数を使用していることを前提としています。彼らはそうではないかもしれませんが、私は私がどのように言うことができるかわかりません。compress.cが機能していることは知っていますが、受け取る引数が同じか異なるかはわかりません。

私は次のコード(スニペット)を持っています:

from PythonMagickWand import *
from ctypes import *

arrayType = c_double * 8  
pointsNew = arrayType()
pointsNew[0] = c_double(eyeLeft[0])
pointsNew[1] = c_double(eyeLeft[1])
pointsNew[2] = c_double(eyeLeftDest[0])
pointsNew[3] = c_double(eyeLeftDest[1])
pointsNew[4] = c_double(eyeRight[0])
pointsNew[5] = c_double(eyeRight[1])
pointsNew[6] = c_double(eyeRightDest[0])
pointsNew[7] = c_double(eyeRightDest[1])

MagickWandGenesis()
wand = NewMagickWand()
MagickReadImage(wand,path_to_image+'image_mod.jpg')
MagickDistortImage(wand,ShepardsDistortion, 8, pointsNew, False)
MagickWriteImage(wand,path_to_image+'image_mod22.jpg')

次のエラーが発生します。

MagickDistortImage(wand,ShepardsDistortion, 8, pointsNew, False) ctypes.ArgumentError: argument 4: <type 'exceptions.TypeError'>: expected LP_c_double instance instead of list

私はpointsNewが引数を提供する間違った方法であることを知っています。しかし、私は正しい形式が何であるかを知りません。これは、ターミナルで実行したときに機能する歪んだコマンドの例です。

convert image.jpg -virtual-pixel Black -distort Shepards 121.523809524,317.79638009 141,275 346.158730159,312.628959276 319,275 239.365079365,421.14479638 232,376 158.349206349,483.153846154 165,455 313.015873016,483.153846154 300,455 0,0 0,0 0,571.0 0,571.0 464.0,571.0 464.0,571.0 0,571.0 0,571.0 image_out.jpg

だから私は質問があると思います:PythonMagickWandによって受け入れられるc_doublesのリストを作成するにはどうすればよいですか?それとも、Shepards DistortionをPythonMagickWandに追加する私のハックは完全に間違っていますか?

基本的にターミナルコマンドを作り直す必要があります。サブプロセスを使用してPythonからコマンドを実行することで動作させましたが、それは私がやりたい方法ではありません。

4

3 に答える 3

2

Reddit.comNeedMoreBeerから:

from PythonMagickWand import *
from ctypes import *

arrayType = c_double * 8  
pointsNew = arrayType()
pointsNew[0] = c_double(121.523809524)
pointsNew[1] = c_double(317.79638009)
pointsNew[2] = c_double(141)
pointsNew[3] = c_double(275) 
pointsNew[4] = c_double(346.158730159)
pointsNew[5] = c_double(312.628959276)
pointsNew[6] = c_double(319)
pointsNew[7] = c_double(275)

ShepardsDistortion = DistortImageMethod(14)

MagickWandGenesis()
wand = NewMagickWand()
MagickReadImage(wand,'/home/user/image.png')
MagickDistortImage(wand,ShepardsDistortion, 8, pointsNew, False)
MagickWriteImage(wand,'/home/user/image_mod22.jpg')

より具体的には、次の行でした。

ShepardsDistortion = DistortImageMethod(14)

それは私のためにそれを修正しました!RedditのNeedMoreBeerに改めて感謝します。

于 2010-06-16T16:21:39.343 に答える
0

エラーメッセージが示すように、関数はポインタ(LP_c_double)を期待していますが、持っているのは配列だけです。

外部関数へのポインターとして配列を渡すために、配列をポインターに明示的にキャストする必要があります。

>>> arr =(c_double * 8)()
>>> arr#単なる配列...
<__ main__。c_double_Array_8オブジェクト(0x1004ad050)>
>>> arr [0] = 5
#..。
>>> cast(arr、POINTER(c_double))#これで正しいタイプになりました
<__main__。LP_c_doubleobjectat 0x1004ad0e0>
>>> cast(arr、POINTER(c_double))[0]
5.0
于 2010-06-08T11:00:50.553 に答える
0

これはOTですが、次のとおりです。

私はPythonの魔法の杖が本当に好きでしたが、600以上の画像で使用すると、どこかでメモリリークが発生し、(32ビット)マシンのすべてのメモリが消費されました。私はおそらくImageMagick自体で考える傾向がありましたが、私は間違っていたかもしれません。

結局、私はそれを見つけました:

GraphicsMagickは、以前のバージョンのImageMagickの移植版です。ただし、ImageMagickはAPIを大幅に変更するため、PythonMagickWantはGraphicsMagickでは機能しません。

GraphicsMagickも、ImageMagickよりも高速であるようです(より優れたマルチタスクを使用)。

スクリプトをすばやく動作させるために、数日で、ImageMagickを使用する代わりに、スクリプトがgimpをロードし、python-scriptfuを使用してスクリプトを実行するように変更しました。すべてが正常に機能しているように見えました。

それがあなたのために働くなら、それを使ってください。また、PythonMagickWandの人は本当に役に立ちます+バインディングは素晴らしいです。

于 2010-06-08T13:30:49.580 に答える