COMPOSITE_DISSOLVE无法在PHP中运行

时间:2014-05-13 20:17:48

标签: php imagemagick imagick

我想用两张图片制作具有淡入淡出效果的混合图像。

这是我的PHP代码。

$img1 = new Imagick();
$img1->readImage("images/1.jpg");

$img2 = new Imagick();
$img2->setOption('compose:args', '50');
$img2->readImage("images/2.jpg");

$img1->compositeImage($img2, imagick::COMPOSITE_DISSOLVE, 0, 0);
$img1->writeImage("images/3.jpg");

此代码在我的Mac OS上正常运行。

但它不能在远程服务器(Cent OS 6.5)上运行,结果图像与2.jpg相同。

我尝试使用COMPOSITE_BLEND常量,效果很好。

我在终端尝试了这个命令。

# composite -dissolve 50 2.jpg 1.jpg 3.jpg

它也很有效。

为什么COMPOSITE_DISSOLVE不能在PHP中继续工作?

请帮帮我。

1 个答案:

答案 0 :(得分:1)

您真的应该弄清楚您的开发环境和服务器之间的区别。很可能是开发服务器上的ImageMagick版本非常过时,除非您自己编译,因为Centos软件包管理系统似乎需要很长时间才能获得新版本。

然而......你混合图像的方式并不是很棒。虽然它可能适合您,但它需要定义稍差的$img2->setOption('compose:args', '50');行。

更强大的技术是通过COMPOSITE_COPYOPACITY自己控制Alpha通道。这使您可以完全控制图像的混合方式。例如

$img1 = new \Imagick();
$img1->readImage(realpath("../images/Biter_500.jpg"));

$img2 = new \Imagick();
$img2->readImage(realpath("../images/Skyline_400.jpg"));

//Resize images to the same size, to look pretty.
$img1->resizeimage(
 $img2->getImageWidth(), 
 $img2->getImageHeight(),
 \Imagick::FILTER_LANCZOS, 
 1
);

//Create an image that the alpha will be created in.
$opacity = new \Imagick();

if (true) {
    //Create a 50% grey image
    $opacity->newPseudoImage($img1->getImageWidth(), $img1->getImageHeight(), "CANVAS:gray(50%)");
}
else {
    //Create a far more interesting blend.
    //Gradients are created top to bottom, so we need to rotate the image  
    $opacity->newPseudoImage($img1->getImageHeight(), $img1->getImageWidth(), "gradient:gray(10%)-gray(90%)");
    $opacity->rotateimage('black', 90);
}

$img2->compositeImage($opacity, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$img1->compositeImage($img2, \Imagick::COMPOSITE_ATOP, 0, 0);

header("Content-Type: image/jpg");
echo $img1->getImageBlob();

使用"CANVAS:gray(50%)"创建不透明度图像的第一种方法可以完成现有图像代码的功能。第二种混合方式可以创建一个在图像宽度上混合10%到90%的图像。