現在の位置: ホーム> 最新記事一覧> 非トルコロール画像でImageColorAllocatealpha()を使用します

非トルコロール画像でImageColorAllocatealpha()を使用します

M66 2025-06-01

PHPでは、 ImageColorallocatealpha()関数を使用して、Alpha(透明性)情報を使用して画像を割り当てます。ただし、この機能に注意する必要があります。非トルコラー画像( ImageCreate()によって作成されたパレット画像)で使用しようとすると、予期しない動作やエラーに遭遇する可能性があります。

それでは、非トルコラー画像で間接的にImageColorallocatealpha()の機能を使用する方法は?この記事では、その原則を説明し、実用的なコードの例を提供します。

1 ??パレット画像でTruecolorを理解します

  • パレットベースの画像
    最大256色を使用して、各色はパレットに保存されます。 ImageCreate()によって作成されました。単純なグラフィックスに適していますが、真の透明チャネルをサポートしていません。

  • Truecolor画像<br> 各ピクセルは、RGB(赤、緑、青)およびアルファ(透明性)値を個別に保存します。 ImageCreatetrueColor()によって作成されました。透明性が必要な複雑なグラフィックとシナリオに適しています。

ImageColorallocatealpha()にはアルファチャネルが含まれるため、有効になるためにTruecolor画像が必要です。

2 ??解決策:最初にTrueColor画像に変換します

最初にImageCreate()を使用してパレット画像を作成した場合、 ImageColorallocatealpha()を使用する前に、Truecolor画像に変換できます。

サンプルコード

<?php
// パレット画像を作成します
$paletteImage = imagecreate(200, 200);
$white = imagecolorallocate($paletteImage, 255, 255, 255);
$black = imagecolorallocate($paletteImage, 0, 0, 0);

// パレット画像をに変換します truecolor 画像
$truecolorImage = imagecreatetruecolor(imagesx($paletteImage), imagesy($paletteImage));
imagecopy($truecolorImage, $paletteImage, 0, 0, 0, 0, imagesx($paletteImage), imagesy($paletteImage));

// 透明性のある色を割り当てます
$transparentRed = imagecolorallocatealpha($truecolorImage, 255, 0, 0, 64); // 64 半透明を示します

// この色を使用して、塗りつぶしの長方形を描きます
imagefilledrectangle($truecolorImage, 50, 50, 150, 150, $transparentRed);

// ASを保存します PNG(透明性をサポートします)
header('Content-Type: image/png');
imagepng($truecolorImage);

// メモリをきれいにします
imagedestroy($paletteImage);
imagedestroy($truecolorImage);
?>

注意すべきこと

  • ImageCreateTrueColor()は、デフォルトで完全に黒い背景を持つ画像を作成します。元のパレット画像の背景を保持したい場合は、 ImageCopy()を使用する必要があります。

  • Alphaチャネルを保存するために、出力はPNG形式です(JPEGは透明性をサポートしません)。

  • 透明度の値は 0(完全に不透明)から127(完全に透明)の範囲です。

3 ??別のヒント:PNGをベース画像として直接使用します

 <?php
$image = imagecreatefrompng('https://m66.net/images/sample.png');
$semiTransparentBlue = imagecolorallocatealpha($image, 0, 0, 255, 80);
imagefilledellipse($image, 100, 100, 80, 80, $semiTransparentBlue);

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