画像処理にPHPのGDライブラリを使用する場合、透明な層の処理は多くの場合頭痛です。特に、 ImageCopyやImageCopymergeなどの関数を使用して複数のレイヤーをオーバーレイする場合、透過部分は他のレイヤーによって簡単に完全に上書きされ、最終的な複合画像が透明性効果を失います。
この記事では、イメージコロラロカチアチアルファ関数を使用して、レイヤー間の相互オーバーレイによって引き起こされる不透明な影響を避けるために、透明性で色を合理的に割り当てる方法を詳細に紹介します。
ImageColorallocatealphaは、画像にアルファ(透明性)情報を含む色を割り当てるためにGDライブラリが提供する関数です。その関数の署名は次のとおりです。
int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )
で:
$画像: ImageCreatetrueColor()によって作成された画像リソース。
$ red 、 $ green 、 $ Blue :色のRGBコンポーネント(0-255)。
$ alpha :透明性(0は完全に不透明で、127は完全に透明です)。
透明な色を背景に割り当てるか、色を埋めることで、層をマージするときに他のレイヤーに完全に上書きされることを避けることができます。
2つのレイヤーがあるとします。
ベース画像(背景画像);
前景マップ(部分的に透明な領域を持つPNG)。
ImageCopyを直接使用して前景画像をオーバーレイすると、GDはデフォルトでアルファチャネルを処理しないため、透明な領域が黒として表示されるか、ベース画像をオーバーレイすることがよくあります。
重要な手順:
1 ??アルファブレンドを有効にします
合成前に、Alphaブレンドをオフにするようにしてください。そうしないと、GDはアルファチャネルを無視します。
imagealphablending($image, false);
2 ??透明な色を割り当てます<br> ImageColorallocatealphaを使用して、完全に透明な色を背景に割り当てます。
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
3 ??アルファチャネルを保存<br> 合成後にアルファチャネルを保存することを忘れないでください。そうしないと、出力PNGが透明性効果を失います。
imagesavealpha($image, true);
これは、透明な層を上書きすることを避ける方法を示す完全なPHPの例です。
<?php
// aを作成します 400x400 真の色のキャンバス
$canvas = imagecreatetruecolor(400, 400);
// 閉鎖 alpha blending,透明な背景を埋めるため
imagealphablending($canvas, false);
// 完全に透明な色を割り当てます
$transparent = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
// 透明な背景としてキャンバスを充填します
imagefill($canvas, 0, 0, $transparent);
// 前景の積み込み PNG 写真(透明な領域で)
$foreground = imagecreatefrompng('https://m66.net/images/foreground.png');
// キャンバスの前景にオーバーレイします
imagecopy($canvas, $foreground, 50, 50, 0, 0, imagesx($foreground), imagesy($foreground));
// 保存 alpha チャネル情報
imagesavealpha($canvas, true);
// ブラウザへの出力
header('Content-Type: image/png');
imagepng($canvas);
// リソースを破壊します
imagedestroy($canvas);
imagedestroy($foreground);
?>
?ファイル形式は透明性をサポートする必要があります
JPEGは、透明性、PNG、およびGIFサポートをサポートしていません。
?アルファブレンドを正しく処理します
合成の前に、合成後にアルファを閉じて保存します。
?透明度値を確認します
ImageColorallocatealphaの透明度範囲は0(不透明)から127(完全に透明)であり、これはCSSで0です1.0 255異なる、変換に注意してください。