PHP-Imagick: изображение шаблона теряет прозрачность

Я пытаюсь заложить / зациклить простое изображение-образец над canvas-image, Вот соответствующий фрагмент кода.

$image = new \Imagick();
$image->newPseudoImage(700, 400, "canvas:black");
$image->setImageFormat("png");
$texture = new \Imagick(realpath('pattern.png'));
$image = $image->textureImage($texture);
header("Content-Type: image/png");
echo $image;

pattern-image (pattern.png) отлично подходит для заголовков по всему холсту, но почему-то кажется, что прозрачность pattern.png в процессе запуталась. Вот результат, который я получаю.

не хороший результат


Вот как должно выглядеть полученное изображение.

ожидаемый результат


На всякий случай, вот var_dump из $texture->getImageProperties();

array (size=8)
  'date:create' => string '2015-10-18T09:59:01+05:00' (length=25)
  'date:modify' => string '2015-02-08T20:53:20+05:00' (length=25)
  'png:IHDR.bit-depth-orig' => string '8' (length=1)
  'png:IHDR.bit_depth' => string '8' (length=1)
  'png:IHDR.color-type-orig' => string '0' (length=1)
  'png:IHDR.color_type' => string '0 (Grayscale)' (length=13)
  'png:IHDR.interlace_method' => string '0 (Not interlaced)' (length=18)
  'png:IHDR.width,height' => string '68, 34' (length=6)

ОКРУЖАЮЩАЯ СРЕДА:

PHP Version 5.5.12
Wampserver2.5
Apache-2.4.9-
Imagick 3.1.2
mageMagick 6.8.9-1 Q16 x64 2014-05-08
Windows 7 : 64 Bit.

ЗАМЕЧАНИЯ: Хотя я понятия не имею, с чего начать, я начал проверять альфа-каналы. Кроме того, другие изображения работают нормально, так что это также может быть проблемой для конкретного изображения. Возможно, что изображение 8-битное?? Нужно ли удалять прозрачность из pattern.png? Если да, то как мне это сделать? Дай мне свои 2 цента:)


ПОПРОБУЙТЕ, ЧТО ТАК, ЧТО НЕ РАБОТАЕТ

  • $image->setImageFormat("png24");
  • $texture->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);

1 ответ

Решение

Ну, в соответствии с отзывами в разделе комментариев, похоже, проблема с версией imagick/imagmagick, которая у меня есть. Так как мне не разрешили обновиться, вот альтернативный вариант, который я придумал, на случай, если кто-то может найти его полезным.

$pattern = new Imagick(realpath('pattern.png')); // Create a new pattern object 
$pw = $pattern->getImageWidth();
$ph = $pattern->getImageHeight();

    $draw = new ImagickDraw(); // Create imagickdraw object 
    $draw->pushPattern('pattern', 0, 0, $pw, $ph);  // Create a pattern identifier 
    $draw->composite(Imagick::COMPOSITE_OVER, 0, 0, $pw, $ph, $pattern); // Composite the pattern 
    $draw->popPattern(); // Close the pattern 
    $cw = 700;
    $ch = 400;

    $draw->push();
    $draw->setFillPatternURL('#pattern');   
    //$draw->setFillColor('yellow');
    $draw->rectangle(0, 0, $cw, $ch);
    $draw->pop();

$canvas = new Imagick(); // Create a new canvas object
$canvas->newImage($cw, $ch, "none");
$canvas->drawImage($draw); // Draw the ImagickDraw on to the canvas 
$canvas->setImageFormat('png'); // Set the format to PNG 
header("Content-Type: image/png"); // Output the image 
echo $canvas; 
Другие вопросы по тегам