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 のドキュメントに結合イメージの使用方法があまり記載されておらず、私が見つけることができる限りサンプルがないことだと思います。したがって、その特定の方法を間違って使用している可能性が非常に高く、最初に単一の Imagick オブジェクトで画像を組み合わせる方法に関係していると思われます。

編集

この質問は最終的に次のようになります: php のみを使用して次のスクリプトを再作成するにはどうすればよいですか?

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

3 に答える 3

4

[編集] ドキュメントをさらに調べてみると、定数 CHANNEL_ALL が何をするのかわかりません。彼らは、チャネルを論理的にORすることでチャネルを連結できると述べています。あなたは試すことができます:

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

[オリジナル] 私はこの API を調べてきましたが、正直なところ、あなたが探しているのは変換機能であり、結合機能ではありません。

以下のリンクを見て、特に「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() が 3 つの画像を 1 つにマージし、情報の一部を破棄することを期待していましたが、以前は個別に処理していたのに対し、実際には 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 に答える