現在の位置: ホーム> 最新記事一覧> 透明な層が他の層によって上書きされないようにする方法

透明な層が他の層によって上書きされないようにする方法

M66 2025-05-28

画像処理にPHPのGDライブラリを使用する場合、透明な層の処理は多くの場合頭痛です。特に、 ImageCopyImageCopymergeなどの関数を使用して複数のレイヤーをオーバーレイする場合、透過部分は他のレイヤーによって簡単に完全に上書きされ、最終的な複合画像が透明性効果を失います。

この記事では、イメージコロラロカチアチアルファ関数を使用して、レイヤー間の相互オーバーレイによって引き起こされる不透明な影響を避けるために、透明性で色を合理的に割り当てる方法を詳細に紹介します。

1 ?? ImageColorallocatealphaとは何ですか?

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 ??典型的な問題:透明な背景がカバーされています

2つのレイヤーがあるとします。

  • ベース画像(背景画像);

  • 前景マップ(部分的に透明な領域を持つPNG)。

ImageCopyを直接使用して前景画像をオーバーレイすると、GDはデフォルトでアルファチャネルを処理しないため、透明な領域が黒として表示されるか、ベース画像をオーバーレイすることがよくあります。

3 ??解決策:ImageColorallocatealphaとAlphaブレンドを使用します

重要な手順:
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);

4 ??完全なサンプルコード

これは、透明な層を上書きすることを避ける方法を示す完全な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);
?>

5 ??メモ

ファイル形式は透明性をサポートする必要があります
JPEGは、透明性、PNG、およびGIFサポートをサポートしていません。

アルファブレンドを正しく処理します
合成の前に、合成後にアルファを閉じて保存します。

透明度値を確認します
ImageColorallocatealphaの透明度範囲は0(不透明)から127(完全に透明)であり、これはCSSで0です1.0 255異なる、変換に注意してください。