PHPのGDライブラリでは、画像の透明な色を画像に設定するために、画像包透過関数を使用します。その基本的な機能は、画像の色を透明な色として指定して、その色のすべてのピクセルが透明として表示されるようにすることです。ただし、実際の開発では、多くの人々は、画像、特に複雑な色または勾配領域に透明な領域を正確に設定したい場合、画像を直接呼び出すことは理想的な効果を達成できないことを発見します。この記事では、画像用透過性を使用して透明な領域を正確に設定し、実用的なヒントと例を紹介する方法を詳細に紹介します。
<?php
// aを作成します100x100本当の色の画像
$image = imagecreatetruecolor(100, 100);
// 画像の赤い背景を埋めます
$red = imagecolorallocate($image, 255, 0, 0);
imagefill($image, 0, 0, $red);
// 赤を透明な色に設定します
imagecolortransparent($image, $red);
// 出力画像
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
上記のコードでは、 ImageColorTransparentは、赤い$赤が透明であることを指定しているため、赤い部分が出力PNG画像で透明として表示されることを指定します。
ImageColorTransparentは、1つの色を透過的に設定することしかできません。この色は、 ImageColorAllocateまたはImageColoratを介して取得される色インデックス値です。問題は次のとおりです。
透明性は1つだけですが、グラデーションまたはマルチカラーの透明ではありません。
画像が真の色( ImageCreateTrueColorによって作成)の場合、透明な色設定は自動的にパレットモードに変換され、色の歪みが発生する可能性があります。
色のマッチングは完全に一貫している必要があり、色のわずかな逸脱は透明性の故障につながります。
まず、真の色の画像をパレット画像( ImageTrueColortopalette )に変換し、次に透明な色を設定します。
<?php
$image = imagecreatetruecolor(100, 100);
// 緑の長方形を描きます
$green = imagecolorallocate($image, 0, 255, 0);
imagefill($image, 0, 0, $green);
// パレット画像に変換します,最多用256色の種類
imagetruecolortopalette($image, false, 256);
// 透明である必要があるカラーインデックスを見つけます
$transparentIndex = imagecolorclosest($image, 0, 255, 0);
// 透明な色を設定します
imagecolortransparent($image, $transparentIndex);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
このアプローチは、色と固定色の画像に適していることに注意してください。また、色がパレットに変換された後、色が詳細を失う可能性があることに注意してください。
真のカラー画像の場合、Alphaチャネルと関数ImagesAvealphaを使用してPNG画像を使用して、ピクセルレベルで透明性を設定することをお勧めします。
<?php
$image = imagecreatetruecolor(100, 100);
// 有効にする alpha チャネル保存
imagesavealpha($image, true);
// 半透明の青い背景を描きます
$transBlue = imagecolorallocatealpha($image, 0, 0, 255, 80);
imagefill($image, 0, 0, $transBlue);
// 不透明な白い円を描きます
$white = imagecolorallocatealpha($image, 255, 255, 255, 0);
imagefilledellipse($image, 50, 50, 80, 80, $white);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
この方法はより柔軟で、勾配と半透明の効果をサポートし、複雑で透明なニーズに適しています。
画像があり、特定のカラー範囲のピクセルを透明に設定したいとしたら、ピクセルトラバーサルを使用して色と組み合わせて判断できるとします。
<?php
$image = imagecreatefrompng('http://m66.net/sample.png');
// 画像の幅と高さを取得します
$width = imagesx($image);
$height = imagesy($image);
// 透明性のある色の範囲を定義します(白の近くのように)
$threshold = 30;
for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
// 白に近いかどうかを判断します
if ($r > 255 - $threshold && $g > 255 - $threshold && $b > 255 - $threshold) {
// このピクセルを完全に透明に設定します
imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, 0, 0, 0, 127));
}
}
}
// 予約する alpha チャネル情報
imagesavealpha($image, true);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
ピクセルを通過することにより、複雑な画像透明性処理に適した透明な領域をより正確に制御できます。
ImageColorTransparentは、単一の色の透明を設定するのに適していますが、アプリケーションの範囲は限られています。
真の色の画像は、パレットモードを使用してImageColorTransperentと組み合わせることができますが、色は失われます。
Alphaチャネルを使用してPNG画像を使用し、 ImagesAvealphaおよびImageColorallocatealphaを介して詳細かつ透明性を実現することをお勧めします。
複雑な透明性の要件は、ピクセルトラバーサルと色の判断を通じて正確に制御できます。
上記のスキルを習得することにより、PHP GDライブラリを柔軟に使用して、透明な画像領域を正確に設定して、さまざまな開発ニーズを満たすことができます。