Я пытаюсь использовать PythonMagickWand , чтобы использовать искажение Шепардса на изображении. Вы также можете увидеть источник distort.c , который используется ImageMagick.
PythonMagickWand по умолчанию не поддерживает искажения Шепарда. Чтобы это исправить, я добавил:
ShepardsDistortion = DistortImageMethod(15)
в строке 544 PythonMagickWand ( Смотрите здесь мой измененный PythonMagicWand ). Указатель 15 относится к distort.h (строка 51) источника MagickWand, в котором ShepardsDistortion является 15-м элементом в списке. Это подходит для всех других поддерживаемых методов искажения.
Теперь я могу ошибаться, предполагая, что существующие методы искажения, поддерживаемые PythonMagickWand, используют аргументы того же типа, что и Шепардс. Они не могут, но я не знаю, как я могу сказать. Я знаю, что 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
Итак, я предполагаю, что вопрос заключается в следующем: как мне создать список c_doubles, который будет принят PythonMagickWand? Или мой хак, чтобы добавить искажение Шепарда в PythonMagick, и совершенно неправильно?
Мне нужно заново создать команду терминала. Я получил его с помощью подпроцесса для запуска команды из Python, но я не хочу это делать.