16

ImageMagickコマンド「convert」を使用して画像を作成するスクリプトを再作成しようとしています。しかし、Imagick(バージョン6.6.2-10)を使用してPHPで同じことをしたいと思います。

コマンドは次のとおりです。

convert A1.mpc A3.mpc A4.mpc -channel rgba -alpha on -virtual-pixel background -background none -define compose:args=312x26.6776 -compose displace -composite out.mpc

パラメータが次のことを表していることがわかりました。

convert  {background} {overlay} [{mask}] [-compose {method}] -composite {result}

PHP Imagickはcomposeメソッドを提供しますが、マスクパラメーターはありません:http ://www.php.net/manual/en/imagick.compositeimage.php

別の質問を見つけてこれを試しました(ただし、同じ画像にはなりません):

// load images
$a1 = new Imagick('a1.png');
$a3 = new Imagick('a3.png');
$a4 = new Imagick('a4.png');

// mask the overlay
$a1->compositeImage($a4, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// compose overlay to background
$a1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);
$a1->setImageBackgroundColor(new ImagickPixel('none'));
$a1->setOption('compose:args', '312x26.6776');
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0);

だから私の質問は:これはマスクを使用して画像を作成する正しい方法ですか?または、ここで何が問題になっていますか?

私がやりたいことを視覚化するのを助けるために、ここにいくつかの入力画像があります:

入力画像a1(背景):

a1

入力画像a3(オーバーレイ):

a3

入力画像a4(マスク):

a4

結果を次のようにします。

正しい出力

私のphpコードが作成するもの:

間違った出力

前もって感謝します!マイケル

4

4 に答える 4

3

CompositeImageメソッドとImagick::COMPOSITE_COPYOPACITYを使用してみてください

于 2012-11-27T14:46:01.553 に答える
1

このコードを試してください:

// x-displacement
$a3->setImageArtifact('compose:args', "312x0");
$a1->compositeImage($a3, Imagick::COMPOSITE_DISPLACE, 0, 0);

// y-displacement
$a4->setImageArtifact('compose:args', "0x26.6776");
$a1->compositeImage($a4, Imagick::COMPOSITE_DISPLACE, 0, 0); 
于 2017-10-26T09:46:05.143 に答える
1

これに苦労した後、私はついにPHP-Imagickでそれを適切に行う方法を見つけました。

// merge x-displacement and y-displacement into one displacement-map
$displaceMask = new Imagick();
$displaceMask->addImage($a3);
$displaceMask->addImage($a4);
$displaceMask->addImage($a4);
$displaceMask->flattenImages();
$displaceMask = $displaceMask->combineImages(Imagick::CHANNEL_ALL);

$displaceMask->setImageArtifact('compose:args', '312x26.6776');
$a1->compositeImage($displaceMask, Imagick::COMPOSITE_DISPLACE, 0, 0);

私が使用したリソース:

于 2019-02-21T12:24:23.827 に答える
1

これが役立つかどうかはわかりませんが、ImageMagick6.9.10.62および6.9.10.5Q16 Mac OSXで画像を処理したところ、以下に示すのと同じ結果になりました。

したがって、問題がある場合は、Imagickに問題がある可能性があります。

6.9.10.xの正確なバージョンは何でしたか?

convert img.png \
\( dx.png dy.png dy.png -combine \) \
-define compose:args=312x26.6776 -compose displace -composite \
result.png


ここに画像の説明を入力してください

同じ画像dxをdyに組み合わせると、悪い結果と同様の結果が得られることに気付きました。これは、addImage、flattenImage、combineImageのいずれかが新しいImagickで正しく機能していないことを意味している可能性があります。

convert img.png \
\( dx.png dx.png dy.png -combine \) \
-define compose:args=312x26.6776 -compose displace -composite \
result2.png


ここに画像の説明を入力してください

コードをチェックして、addImageに$ a3、$ a3、および$a3または$a4のいずれかを使用してタイプミスがないことを確認します。

テストには、PHPを試してください

exec("convert img.png \( dx.png dy.png dy.png -combine \) -define compose:args=312x26.6776 -compose displace -composite result.png")
于 2019-08-30T06:16:21.990 に答える