使用ImageMagick(php)将RGB通道合并为单个图像

时间:2012-05-31 16:17:54

标签: php image-processing imagemagick

所以我对ImageMagick和php有一个假设,我需要分别处理每个RGB通道,然后将它们合并到最终图像中。因此,在下面的代码中,$ red,$ green和$ blue是通道(作为灰度图像)。以下代码是我尝试过的(以及几个变体),但每次我最终得到的图像只有青色,洋红色或黄色显示。在这种情况下,生成的图像是青色。

$im->removeImage();
$im->addImage($red);
$im->addImage($green);
$im->addImage($blue);
$img = $im->combineImages(self::CHANNEL_ALL);

$im->removeImage();
$im->removeImage();
$im->removeImage();
$im->addImage($img);

我认为我的部分问题是PHP文档没有说明如何使用combineImages,到目前为止我没有找到样本。所以我很可能错误地使用了这种特殊的方法,我怀疑它与我如何组合单个Imagick对象中的图像有关。

修改

这个问题最终归结为:如何仅使用php重新创建以下脚本?

convert tmp_r.png tmp_g.png tmp_b.png -combine tmp_rgb.png

3 个答案:

答案 0 :(得分:4)

<强> [编辑] 我不得不承认,进一步研究文档,我不确定CHANNEL_ALL的常量是什么。他们确实声明您可以通过逻辑或将它们组合在一起来连接通道。你可以试试:

$ im-&gt; combineImages(imagick :: CHANNEL_RED | imagick :: CHANNEL_GREEN | imagick :: CHANNEL_BLUE);

<强> [原稿] 我一直在研究这个API,老实说,我认为你正在寻找的是转换功能,而不是组合功能。

查看下面提供的链接,然后专门点击“组合RGB通道图像” http://www.imagemagick.org/Usage/color_basics/

试试,如果您需要进一步的帮助,请发表评论: - )

答案 1 :(得分:3)

所以我想我已经想出如何让它发挥作用。缺少的部分是对flattenImages()的调用。我不确定为什么会这样,但它似乎是我在寻找的东西。这是代码(请记住,$ this是在扩展Imagick的类的成员方法的上下文中):

$this->removeImage(); // gets rid of the old, unprocessed image
$rgb = clone $this;

$rgb->addImage($red);
$rgb->addImage($green);
$rgb->addImage($blue);
$rgb->flattenImages(); // this is what was missing above

$rgb = $rgb->combineImages(self::CHANNEL_ALL);

$this->addImage($rgb);

有人可以评论为什么会这样吗?我希望flattenImages()将三个图像合并为一个并销毁一些信息,但它似乎实际上告诉ImageMagick将所有包含的图像一起处理,而它之前是独立处理它们。

答案 2 :(得分:-1)

试试这个:

$im->addImage($red);
$im->addImage($green);
$im->addImage($blue);
$im->combineImages(imagick::CHANNEL_RED | imagick::CHANNEL_GREEN | imagick::CHANNEL_BLUE);

btw combineImages不返回imagick对象,但是true / false表示成功或失败,因此$im将包含您的组合图像。

编辑: 显然,combineImages吸引了很多时间,所以这里有一个替代方案:imagick::compositeImage

$im->compositeImage($red, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_RED);
$im->compositeImage($green, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_GREEN);
$im->compositeImage($blue, imagick::COMPOSITE_COPY, 0, 0, imagick::CHANNEL_BLUE);