在使用 PHP 的 GD 库进行图形绘制时,开发者有时需要在图像上绘制多边形。传统上,imageopenpolygon() 函数可以绘制一个空心的多边形轮廓。但有些时候,我们希望使用 imagefilledpolygon() 来实现更加灵活的绘制效果,尤其是在需要处理颜色填充和轮廓样式时。本文将介绍如何使用 imagefilledpolygon() 替代 imageopenpolygon(),并解决绘制空心多边形的问题。
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 确保最后一个点能和第一个点连接闭合。
如果想要内部透明,可以在创建画布后使用 imagesavealpha() 和 imagecolorallocatealpha() 设置透明背景。
如果背景不是纯色,可以适当调整 imagefilledpolygon() 的填充颜色,或者直接不填充,仅靠 imageline() 绘制轮廓。