通过渐变合并两个图像

时间:2014-01-27 13:39:58

标签: php image imagemagick imagick

我正在尝试合并PHP中的两张图片,中间相互重叠,如下所示:http://i.stack.imgur.com/ejdDQ.jpg

然而,我没有运气。 在ImageMagick页面上,他们使用此方法在命令行中执行此操作: http://www.imagemagick.org/Usage/photos/#overlap 但由于我不能在我的服务器上使用exec,我必须借助安装在服务器上的imagick扩展(http://us1.php.net/manual/en/book.imagick.php)以某种方式进行操作。

有没有办法让这项工作?

1 个答案:

答案 0 :(得分:0)

使用链接中的源文件和下面的代码生成图像:

Imagick generated image

//Load the images
$left = new Imagick(realpath('../images/im/holocaust_tn.gif'));
$right = new Imagick(realpath('../images/im/spiral_stairs_tn.gif'));
$gradient = new Imagick(realpath('../images/im/overlap_mask.png'));

//The right bit will be offset by a certain amount - avoid recalculating.
$offsetX = $gradient->getImageWidth() - $right->getImageWidth();


//When doing the fading of the images, ImageMagick uses "White == show image".
//The gradient is setup with black on the left, white on the right. So the for
//the left image we need to reverse the gradient to make it white on the left.
$negativeGradient = clone $gradient;
$negativeGradient->negateimage(false);

//Fade out the left part
$left->compositeimage(
    $negativeGradient,
    Imagick::COMPOSITE_COPYOPACITY,
    0, 0
);

//Fade out the right part - offset the gradient
//to make it align in the final image
$right->compositeimage(
    $gradient,
    Imagick::COMPOSITE_COPYOPACITY,
    -$offsetX, 0
);

//Create a new canvas to render everything in to.
$canvas = new Imagick();
$canvas->newImage($gradient->getImageWidth(), $gradient->getImageHeight(), new ImagickPixel('black'));

//Blend left half into final image
$canvas->compositeimage(
    $left,
    Imagick::COMPOSITE_BLEND,
    0, 0
);

//Blend Right half into final image
$canvas->compositeimage(
    $right,
    Imagick::COMPOSITE_BLEND,
    $offsetX, 0
);


//Output the final image
$canvas->setImageFormat('png');

header("Content-Type: image/png");
echo $canvas->getImageBlob();
// And Robert is your father's brother.