Вы можете использовать ImageMagick «s +distort
оператор вроде этого:
Во-первых, создать стартовую форму:
convert -size 100x300 xc:green shape.gif

Теперь искажать его расширить основание:
convert shape.gif -virtual-pixel none \
+distort Perspective '0,0,0,0 99,0,99,0 0,299,-60,299 99,299,160,299' result.gif

Есть 4 пары чисел. Первая пара говорит, что пиксель [0,0] (верхний левый угол) во входном изображении должен появиться на [0,0] на выходном изображении. Второй говорит, что пиксель [99,0] (верхний правый) должен отображаться в том же месте на выходном изображении. Третий говорит, что нижний левый пиксель должен быть на [-60,299] на выходном изображении - то есть на 60 пикселей слева от его текущего положения и вне границы текущего изображения. Аналогично, правый правый пиксель должен отображаться на 60 пикселей справа от его текущего положения и, следовательно, за пределами существующей базы изображений.
Значение виртуального пикселя none
делает вновь созданные пиксели прозрачными. Существуют и другие возможные настройки для виртуального пикселя, которые могут быть перечислены следующим образом:
identify -list virtual-pixel
Выход
Background
Black
CheckerTile
Dither
Edge
Gray
HorizontalTile
HorizontalTileEdge
Mirror
None
Random
Tile
Transparent
VerticalTile
VerticalTileEdge
White
Если вы хотите сделать свой код немного больше зависит от размеров изображение, вы можете параметризовать их с помощью fx
операторов и новой magick
команды вместо convert
:
magick shape.gif -virtual-pixel none \
+distort Perspective '0,0,0,0 %[fx:w-1],0,%[fx:w-1],0 0,%[fx:h-1],-60,%[fx:h-1] %[fx:w-1],%[fx:h-1],%[fx:w+60],%[fx:h-1]' result.gif
Есть jmagick, но я не думаю, что он поддерживает -distort. Вы можете использовать AJAX для передачи координат от JavaScript к Imagemagick/php, и я полагаю, это зависит от того, какую функциональность вы хотите. Похоже, вы можете использовать графическую магию с node.js – Bonzo
Помог ли мой ответ решить вашу проблему? Если да, пожалуйста, подумайте о том, чтобы принять его как ваш ответ - нажав полый зеленый галочку/галочку рядом с подсчетом голосов. Если нет, скажите, пожалуйста, что не сработало, чтобы я или кто-то еще помог вам дальше. Благодарю. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 –