4

所以我有一个 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
4

3 回答 3

4

[编辑] 我不得不承认,进一步查看文档,我不确定常量 CHANNEL_ALL 的作用。他们确实声明您可以通过逻辑或将它们连接在一起来连接通道。你可以试试:

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

[原创] 我一直在研究这个 API,老实说,我认为您正在寻找的是 convert 函数,而不是 combine 函数。

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

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

于 2012-06-04T18:35:22.033 回答
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 一起处理所有包含的图像,而它之前是独立处理它们的。

于 2012-06-04T20:48:43.140 回答
-1

试试这个:

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

顺便说一句 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);
于 2012-06-04T18:44:15.693 回答