2017-07-06 3 views
2

次の画像をマージする必要がありますが、私の解決策は機能しません。PHPで2つのPNG画像をマージします。出力画像の変更と不透明度の不一致

私のコードでは、どちらの画像は透明な背景をPNGですし、両方が1500x1500です

<?php 
$dest = imagecreatefrompng($_GET['img1']); 
$src = imagecreatefrompng($_GET['img2']); 

imagecopymerge($dest, $src, 0, 0, 0, 0, 1500, 1500, 50); 

$white = imagecolorallocate($dest, 255, 255, 255); 
imagecolortransparent($dest, $white); 

header('Content-Type: image/png'); 
imagepng($dest); 
?> 

(私はGETパラメータによってスクリプトに画像のURLを渡す)以下の通りです。

最初のイメージ:

enter image description here

第二の画像:私は何を得る

enter image description here

:私は最終的なイメージが権利を持つことはできませんなぜ enter image description here

不透明度?私はimagecopymerge()の最後の値を0または100に変更しようとしましたが、そのような場合には1つのイメージしか得られません。私はそれらの両方が必要です、お互いに正確に重なり合っています!

また、最終画像で宝石の周りを慎重に見ると、余分な青色があります...これはどのように可能ですか?

enter image description here

答えて

0

これは、透明な100%までの任意の白(#ffffff)画素を設定imagecolortransparentへの呼び出しによって画像の透明性はなく、ピクセル毎アルファチャンネルの透明度を使用するように、得られた画像を設定することによって引き起こされます。

結果画像のアーチファクト(余分な青色とエッジピクセル)は、保存されていない元の画像からのアルファチャンネルの透明度と、その画像を保存していないピクセル(100%透明ですが白ではありません)元の色。

結果が「洗い流された」ように見えるのは、imagecopymergeに、2つの画像を50%の透明度で結合するように指示することです。

ソリューションが正しいアルファの設定を使用することです:

<?php 

$dest = imagecreatefrompng($_GET['img1']); 
$src = imagecreatefrompng($_GET['img2']); 

imagesavealpha($dest, true); 

imagecopy($dest, $src, 0, 0, 0, 0, 1500, 1500); 

header('Content-Type: image/png'); 
imagepng($dest); 
+0

@wiredmarkこれはあなたの問題を解決しましたか? – timclutton

関連する問題