, так как в некоторые дни я буду пытаться обернуть изображение вокруг цилиндра (позже, чтобы создать предварительные изображения чашек с отдельными изображениями) с помощью Imagick и PHP. Мое текущее решение основано на документации IM: http://www.imagemagick.org/Usage/mapping/
convert rose: -background black -gravity south -splice 0x8 \
\( +clone -sparse-color barycentric '0,0 black 69,0 white' \) \
\( -clone 1 -function arcsin 0.5 \) \
\( -clone 1 -level 25%,75% \
-function polynomial -4,4,0 -gamma 2 \
+level 50%,0 \) \
-delete 1 \
-virtual-pixel black -define compose:args=17x7 \
-compose Displace -composite rose_cylinder.png
Я пытаюсь преобразовать эту команду в функции PHP Imagick, но результат не соответствует ожиданиям .
Вот мой код:
$clondedOriginal = clone $img;
$clondedOriginal->setBackgroundColor("none");
$clondedOriginal->setGravity(Imagick::GRAVITY_SOUTH);
$mapBase = new Imagick();
$mapBase->newPseudoImage($clondedOriginal->getImageWidth(), $clondedOriginal->getImageHeight(), "canvas:white");
$mapBase->sparseColorImage(Imagick::SPARSECOLORMETHOD_BARYCENTRIC, [0, 0, 0, 0, 0, 1, $mapBase->getImageWidth(), 0, 1, 1, 1, 1]);
$mapBase->writeImage($dir . "/testBase.png");
$xMap = clone $mapBase;
$xMap->functionImage(Imagick::FUNCTION_ARCSIN, [0.5]);
$xMap->writeImage($dir . "/testX.png");
$yMap = clone $mapBase;
$quantumLong = Imagick::getQuantumRange()['quantumRangeLong'];
$yMap->levelImage( 0.25 * $quantumLong, $yMap->getImageGamma(), 0.75 * $quantumLong, Imagick::CHANNEL_ALL);
$yMap->functionImage(Imagick::FUNCTION_POLYNOMIAL, [-4,4,0]);
$yMap->levelImage(0.5 * $quantumLong, $yMap->getImageGamma(), 0);
$yMap->writeImage($dir . "/testY.png");
$clondedOriginal->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BLACK);
$clondedOriginal->setImageArtifact("compose:args", "200x0");
$clondedOriginal->compositeImage($xMap, Imagick::COMPOSITE_DISPLACE, 0, 0);
$clondedOriginal->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BLACK);
$clondedOriginal->setImageArtifact("compose:args", "0x200");
$clondedOriginal->compositeImage($yMap, Imagick::COMPOSITE_DISPLACE, 0, 0);
$clondedOriginal->writeImage($dir . "/didit.png");
Каждый шаг, который я пытался генерировать Testimages. Вот они
Я надеюсь, что есть кто-то, кто может мне помочь .