Изменение направления дуги в php Imagick

#php #imagemagick #imagick

#php #imagemagick #imagick

Вопрос:

Я использую Imagick в php для обработки и перекрытия изображений с помощью compositeImage, а затем сгибаю верхнюю и нижнюю границы изображения. Для достижения этого я использовал DISTORTION_ARC :

 $distortPoints = array( 120 );
$img->setImageVirtualPixelMethod( Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$img->setImageMatte( TRUE );
$img->distortImage(Imagick::DISTORTION_ARC, $distortPoints, FALSE);
  

Это придает изображению дугообразную форму, но я собираюсь изменить направление дуги (https://photos.app.goo.gl/1JAthzLBoVsozQy97 ).

Обновить:

Я нашел скрипт в скриптах ImageMagick Фреда (http://www.fmwconcepts.com/imagemagick/cylinderwarp/index.php ), это делает именно то, что я ищу, но я не могу использовать это в php.

Ответ №1:

Я не уверен, что понимаю, какой эффект вы действительно хотите в ImageMagick. Но вот две пары примеров. Первая пара использует -distort arc, а вторая пара использует -distort barrel. В каждой паре одно изображение изгибается в одну сторону, а другое — в другую.

Вторая команда отвечает на ваш вопрос о сгибании дуги вниз.

введите описание изображения здесь

 convert rose: -virtual-pixel White -distort arc 60 rose1.jpg
  

введите описание изображения здесь

 convert rose: -virtual-pixel White -rotate 180 -distort arc 60 -rotate 180 rose2.jpg
  

введите описание изображения здесь

 convert rose: -virtual-pixel White -distort barrel "0.0 0.0 0.0 1.0   0.0 0.0 0.5 0.5"  rose3.jpg
  

введите описание изображения здесь

 convert rose: -virtual-pixel White -distort barrel "0.0 0.0 0.0 1.0   0.0 0.0 -0.5 1.9" rose4.jpg
  

введите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ, я также пробовал barrel ранее и не смог выяснить, как работают параметры, в arc мы можем изменить степень, но здесь изменение значений искажает изображение, и я не могу найти документ, который объясняет использование этого.

2. документы по искажению дуги находятся по адресу imagemagick.org/Usage/distorts/#arc

3. Спасибо за ваши ответы, на самом деле я искал цилиндрический, для которого я нашел ваш скрипт ( fmwconcepts.com/imagemagick/cylinderwarp/index.php ), но я не могу использовать его в php. Я не могу преобразовать ваш пример скрипта в php для выполнения.

4. Вы можете запустить мой скрипт из PHP exec(). Но мой скрипт cylinderize не будет делать то, что вы хотите, как указано в вашем новом сообщении.

5. хорошо, спасибо за ответ, без проблем, я воспользуюсь вашим скриптом, поскольку он ближе к тому, чего я пытаюсь достичь, я проверил ваши параметры, но я не могу заставить его работать, например, если имя моего изображения.png так что, пожалуйста, дайте мне знать, что именно я должен передать в exec () после загрузки скрипта на сервер и добавления разрешения на выполнение?

Ответ №2:

Вот результат использования моей команды ImageMagick cylinderize для размещения вашего изображения на кружке.

Изображение:

введите описание изображения здесь

Кружка:

введите описание изображения здесь

 cylinderize -m vertical -r 73 -l 120 -w 40 -p 5 -n 94 -e 2 -a 0 -v background -b none -f none -o  24 10 stay_home.jpg coffee_mug1.jpg result.jpg
  

Результат:

введите описание изображения здесь

Смотрите мою домашнюю страницу для получения указателей для использования с PHP exec().

ПРИМЕЧАНИЕ: Для использования моего скрипта в коммерческих целях вам нужно будет связаться со мной по поводу лицензирования.

Комментарии:

1. Спасибо, это работает, но мне нужна небольшая помощь с размером и положением стикера, не могли бы вы, пожалуйста, объяснить мне параметры, переданные для установки верхнего и левого положения? например, если я хочу разместить наклейку в 20 пикселях сверху, в 15 пикселях слева и размером 200 пикселей x 200 пикселей?

2. Это так не работает. Размер определяется длиной (по вертикали) и радиусом (окружности) вместе с аргументом wrap. Итак, вам нужно измерить высоту кружка на изображении как длину и ширину кружка как диаметр = 2 * радиус. Затем обертывание определяет, какая часть изображения будет обтекать кружок. Если вы хотите, чтобы ширина изображения заполняла переднюю половину кружка, то установите значение обтекания равным 50, а ширина будет равна радиусу. Положение задается с помощью аргумента offsets относительно центра изображения кружка. Итак, -o 0 0 — это центр.