我正在尝试使用PythonMagickWand在图像上使用Shepards distortion。您还可以看到ImageMagick使用的the source of distort.c

默认情况下,PythonMagickWand不支持Shepards变形。为了解决这个问题,我添加了:

ShepardsDistortion = DistortImageMethod(15)

到PythonMagickWand(See here for my modified PythonMagicWand)的544行。 15指针指向MagickWand源的distort.h(第51行),其中ShepardsDistortion是列表中的第15个项目。这适合所有其他受支持的失真方法。

现在,我可能做错了一些事情,假设PythonMagickWand支持的现有失真方法使用与Shepards相同类型的参数。他们可能没有,但我不知道该如何说。我知道distort.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是提供参数的错误方法。但是我只是不知道什么是正确的格式。这是在终端中运行时可以运行的示例distort命令:

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_double列表?还是将Shepards Distortion添加到PythonMagickWand的黑客是完全错误的?

我基本上需要重新创建终端命令。我已经通过使用子进程从Python运行命令来使其工作了,但这不是我想要的方式。

最佳答案

NeedMoreBeer上的Reddit.com

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。

关于python - PythonMagickWand Shepards失真(ctypes LP_c_double问题),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2989543/

10-09 01:09