PHPのGDライブラリを使用してグラフを描画する場合、開発者は画像にポリゴンを描く必要がある場合があります。従来、 ImageOpenPolygon()関数は、中空のポリゴンのアウトラインを引き出すことができます。しかし、特に色の詰め物や輪郭のスタイルを扱う必要がある場合、より柔軟な描画効果を実現するために、 ImageFilledPolygon()を使用したい場合があります。この記事では、ImageOpenPolygon()の代わりにImageFilledPolygon()を使用する方法を紹介し、中空のポリゴンを描く問題を解決します。
ImageOpenPolygon()は主に中空のポリゴンを描くために使用され、その効果は単なるストロークであり、内部充填はありません。 ImageFilledPolygon()は、塗りつぶされたポリゴンを直接描画できます。
特定の境界色またはより複雑なコントロールでポリゴンを描画したい場合、 ImageFilledPolygon()はより柔軟です。特に、 ImageOpenPolygon()がより多様な描画要件をサポートしていない場合、 ImageFilledPolygon()を使用して自分で輪郭の描画をシミュレートすることは良い選択肢です。
基本的なアイデアは次のとおりです。
ImageFilledPolygon()を使用して、塗りつぶされたポリゴンを描画します(背景または透明な色で埋めます)。
ImageLine()を使用して、ポリゴンの境界線を個別に描画します。
これにより、充填色と境界色の色を手動で制御して、目的の中空ポリゴン効果を実現できます。
以下は、ImageFilledPolygon()を使用してImageOpenPolygon()と同様の効果を達成する方法を示す完全な例です。
<?php
// キャンバスを作成します
$image = imagecreatetruecolor(300, 300);
// 色を割り当てます
$white = imagecolorallocate($image, 255, 255, 255);
$borderColor = imagecolorallocate($image, 0, 0, 0);
// 背景を埋めます
imagefill($image, 0, 0, $white);
// ポリゴンのポイントを定義します
$points = [
50, 50,
250, 70,
200, 200,
100, 250,
60, 150
];
// ポリゴンを埋めます(背景色を使用します,内部を透明または同じ色に保ちます)
imagefilledpolygon($image, $points, count($points) / 2, $white);
// ポリゴンの境界線を描きます
$num_points = count($points) / 2;
for ($i = 0; $i < $num_points; $i++) {
$x1 = $points[$i * 2];
$y1 = $points[$i * 2 + 1];
$x2 = $points[(($i + 1) % $num_points) * 2];
$y2 = $points[(($i + 1) % $num_points) * 2 + 1];
imageline($image, $x1, $y1, $x2, $y2, $borderColor);
}
// 出力画像
header('Content-Type: image/png');
imagepng($image);
// 無料のリソース
imagedestroy($image);
?>
ImageFilledPolygon()は背景色で満たされ、内部領域が変色しないようにします。
ループImageLine()を使用して、各頂点を手動で接続して、ポリゴンの外側の境界を描きます。
($ i + 1)%$ num_pointsは、最後のポイントを最初のポイントに接続できることを保証します。
内部透明性が必要な場合は、Canvasを作成した後、 ImageAvealpha()とImageColorallocatealpha()を使用して透明な背景を設定できます。
背景が固体色でない場合は、 ImageFilledPolygon()の塗りつぶし色を適切に調整するか、直接塗りつぶさないで、 ImageLine()のみでアウトラインを描画できます。