web-dev-qa-db-ja.com

Imagickを使用して画像をマージおよびマスクする方法

画像処理の知識がほとんどなく、使用されている用語も少ないため、ご容赦ください。

基本的に、2つの画像を1つにマスクとして機能するようにマージします。その画像は次のようになります。
Example
実際には、青色と黄色の背景がどちらも透明です。

この画像は、通常の写真のマスクとして使用されています。サークルから「はみ出している」写真の一部は、内側を表示したまま、「トリミング」(非表示にする)する必要があります。
青色の領域にあるものはすべて見えず、黄色の領域にあるものはすべて見えます。

正直なところ、どうすればいいのかわからないので、助けていただければ幸いです。

編集:
コマンドラインバージョンではなく、APIバージョンのImagickを使用しています

編集:
私が達成したいことを感じるために、ここに例を示します。

したがって、入力画像は次のとおりです。
enter image description here
これはマスクイメージであり、常に同じです

enter image description here
これは、動的な画像の例です

enter image description here
これが最終結果のようになります

26

だから、最後に、これはあなたが必要なことをするはずです:

元の画像:

http://i.stack.imgur.com/b7seR.png

不透明マスク:

enter image description here

オーバーレイ:

http://i.stack.imgur.com/3ulkM.png

出力:

enter image description here

コード:

<?php
$base = new Imagick('U0R4F.png');
$mask = new Imagick('mask.png');
$over = new Imagick('3ulkM.png');

// Setting same size for all images
$base->resizeImage(274, 275, Imagick::FILTER_LANCZOS, 1);

// Copy opacity mask
$base->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

// Add overlay
$base->compositeImage($over, Imagick::COMPOSITE_DEFAULT, 0, 0);

$base->writeImage('output.png');
header("Content-Type: image/png");

echo $base;
?>

それが今だといいのですが!注:この例では、ベースイメージを縮小したように見えますが、縮小していません(私の目的は、マスキングの方法を示すことだけです)。

64
user703016

このソリューションをここで試しましたか? https://stackoverflow.com/a/2351173/1093649

これをサーバーで実行し(正しいイメージ名を使用して!)、お知らせください。ありがとうございます。

nb:クレジットは jspash に移動します

1
Justin T.

このタイプのマスキングは、ImageMagickの例、サムネイル、マスク、ペイントでさまざまなテクニックを使用して例示されています http://www.imagemagick.org/Usage/thumbnails/#mask_Paint

ただし、オーバーレイ画像のマスキングとエッジは一致してはならない(SHOULD NOT MATCH)ことが重要です。そうしないと、エッジエイリアシング効果で問題が発生し、回避するのが最善です。

リングのアルファマスクを抽出するには、モルフォロジーオペレーターを使用してそれを中心線まで薄くし、ランダムな「リング」形状のマスクを生成できます。 ImageMagickの例、間引きによるスケルトン、およびプルーニング http://www.imagemagick.org/Usage/morphology/#thinning_skeleton

ImageMagickサンプルのAnthony Thyssen Webマスター、およびImageMagick開発者

PS:Elflingからの素敵な写真

0
anthony

http://www.imagemagick.org/Usage/compose/#dstin でうまくいくはずですが、アルファチャンネル付きの画像を使用する必要があります(問題ありません)。

編集:PHPでそれを渡す必要があります(imagick::COMPOSITE_DSTINcompositeimage のパラメータとして。 複合演算子定数 の他のフィルターも役立つ場合があります。

0
Viruzzo