PHP GD 1つの画像を使用して別の画像をマスクする(透明度を含む) 質問する

PHP GD 1つの画像を使用して別の画像をマスクする(透明度を含む) 質問する

画像を取得する PHP スクリプトを作成しようとしています:

画像1
https://i.sstatic.net/eNvlM.png

次に PNG 画像を適用します。

マスク
https://i.sstatic.net/iJr2I.png

マスクとして。

最終結果では透明性を維持する必要があります。

結果
https://i.sstatic.net/u0l0I.png

可能であれば、これを GD で実行したいのですが、現時点では ImageMagick は選択肢になりません。

これについてどうしたらいいでしょうか?

phalacee の投稿 (「PHP/GD、ある画像から別の画像に円をコピーするにはどうすればいいですか?」)正しい方向に進んでいるようですが、具体的には、形状ではなくマスクとして画像を使用する必要があります。

ベストアンサー1

マット、

透明な背景の黒塗りではなく、黒の背景に楕円形の白塗りで PNG を作成する場合は、次の関数を使用します。

<?php
// Load source and mask
$source = imagecreatefrompng( '1.png' );
$mask = imagecreatefrompng( '2.png' );
// Apply mask to source
imagealphamask( $source, $mask );
// Output
header( "Content-type: image/png");
imagepng( $source );

function imagealphamask( &$picture, $mask ) {
    // Get sizes and set up new picture
    $xSize = imagesx( $picture );
    $ySize = imagesy( $picture );
    $newPicture = imagecreatetruecolor( $xSize, $ySize );
    imagesavealpha( $newPicture, true );
    imagefill( $newPicture, 0, 0, imagecolorallocatealpha( $newPicture, 0, 0, 0, 127 ) );

    // Resize mask if necessary
    if( $xSize != imagesx( $mask ) || $ySize != imagesy( $mask ) ) {
        $tempPic = imagecreatetruecolor( $xSize, $ySize );
        imagecopyresampled( $tempPic, $mask, 0, 0, 0, 0, $xSize, $ySize, imagesx( $mask ), imagesy( $mask ) );
        imagedestroy( $mask );
        $mask = $tempPic;
    }

    // Perform pixel-based alpha map application
    for( $x = 0; $x < $xSize; $x++ ) {
        for( $y = 0; $y < $ySize; $y++ ) {
            $alpha = imagecolorsforindex( $mask, imagecolorat( $mask, $x, $y ) );
            $alpha = 127 - floor( $alpha[ 'red' ] / 2 );
            $color = imagecolorsforindex( $picture, imagecolorat( $picture, $x, $y ) );
            imagesetpixel( $newPicture, $x, $y, imagecolorallocatealpha( $newPicture, $color[ 'red' ], $color[ 'green' ], $color[ 'blue' ], $alpha ) );
        }
    }

    // Copy back to original picture
    imagedestroy( $picture );
    $picture = $newPicture;
}

?>

おすすめ記事