現在の位置: ホーム> 最新記事一覧> ImageOpenPolygon()の代わりにImageFilledPolygon()を使用してポリゴンを塗りつぶす方法

ImageOpenPolygon()の代わりにImageFilledPolygon()を使用してポリゴンを塗りつぶす方法

M66 2025-05-29

PHPのGDライブラリを使用してグラフを描画する場合、開発者は画像にポリゴンを描く必要がある場合があります。従来、 ImageOpenPolygon()関数は、中空のポリゴンのアウトラインを引き出すことができます。しかし、特に色の詰め物や輪郭のスタイルを扱う必要がある場合、より柔軟な描画効果を実現するために、 ImageFilledPolygon()を使用したい場合があります。この記事では、ImageOpenPolygon()の代わりにImageFilledPolygon()を使用する方法を紹介し、中空のポリゴンを描く問題を解決します。

ImageOpenPolygon()の代わりにImageFilledPolygon()を使用する理由

ImageOpenPolygon()は主に中空のポリゴンを描くために使用され、その効果は単なるストロークであり、内部充填はありません。 ImageFilledPolygon()は、塗りつぶされたポリゴンを直接描画できます。

特定の境界色またはより複雑なコントロールでポリゴンを描画したい場合、 ImageFilledPolygon()はより柔軟です。特に、 ImageOpenPolygon()がより多様な描画要件をサポートしていない場合、 ImageFilledPolygon()を使用して自分で輪郭の描画をシミュレートすることは良い選択肢です。

使い方

基本的なアイデアは次のとおりです。

  1. ImageFilledPolygon()を使用して、塗りつぶされたポリゴンを描画します(背景または透明な色で埋めます)。

  2. 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()のみでアウトラインを描画できます。

拡張:実際のプロジェクトでのアプリケーション