Оберните изображение на цилиндре с помощью Imagick в PHP - PullRequest
0 голосов
/ 12 апреля 2020

, так как в некоторые дни я буду пытаться обернуть изображение вокруг цилиндра (позже, чтобы создать предварительные изображения чашек с отдельными изображениями) с помощью 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. Вот они

Я надеюсь, что есть кто-то, кто может мне помочь .

...