PHP-Imagick : 图案图像正在失去不透明度
PHP-Imagick : Pattern image is loosing opacity
我正在尝试 tile/loop 一个简单的 pattern-image 而不是 canvas-image
。这是一个相关的 code-snippet.
$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 ) 在 canvas 上的标题很好,但不知何故 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.
FOOTNOTES : 虽然我不知道从哪里开始寻找,但我已经开始检查 alpha 通道。此外,其他图像工作正常,因此这也可能是 image-specific 问题。也许,图像是 8 位的??我需要从 pattern.png 中删除透明度吗?如果是这样,我该怎么做?给我你的 2 美分 :)
到目前为止已经尝试过但没有成功:
$image->setImageFormat("png24");
$texture->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
嗯,根据评论区反馈,好像是我的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;
我正在尝试 tile/loop 一个简单的 pattern-image 而不是 canvas-image
。这是一个相关的 code-snippet.
$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 ) 在 canvas 上的标题很好,但不知何故 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.
FOOTNOTES : 虽然我不知道从哪里开始寻找,但我已经开始检查 alpha 通道。此外,其他图像工作正常,因此这也可能是 image-specific 问题。也许,图像是 8 位的??我需要从 pattern.png 中删除透明度吗?如果是这样,我该怎么做?给我你的 2 美分 :)
到目前为止已经尝试过但没有成功:
$image->setImageFormat("png24");
$texture->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
嗯,根据评论区反馈,好像是我的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;