在 PHP 中使用 GD 库绘图时,想要实现漂亮的半透明效果,通常需要结合使用 alpha 通道处理。在这篇文章中,我将带你了解如何通过 imageopenpolygon() 函数配合 alpha 渐变,绘制出既流畅又半透明的多边形效果。
imageopenpolygon() 是 PHP GD 库中的一个绘图函数,用来在画布上绘制开放式多边形。与 imagepolygon()(闭合多边形)不同的是,imageopenpolygon() 只绘制多边形的线条,并不会自动闭合首尾点。
函数基本语法如下:
bool imageopenpolygon(GdImage $image, array $points, int $num_points, int $color)
$image:目标图像资源。
$points:包含点坐标的数组,格式为 [x1, y1, x2, y2, ..., xn, yn]。
$num_points:点的数量。
$color:绘图使用的颜色。
GD 库支持 RGBA 格式颜色,可以让颜色带有透明度(alpha)。通过控制 alpha 值,就能实现渐变的透明效果。
下面是一个实际示例,演示如何使用 imageopenpolygon() 绘制带有半透明渐变的多边形。
<?php
// 创建画布
$width = 400;
$height = 400;
$image = imagecreatetruecolor($width, $height);
// 启用 alpha 通道保存信息
imagesavealpha($image, true);
// 用透明色填充背景
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
// 定义多边形的点
$points = [
50, 50,
350, 50,
350, 350,
50, 350
];
// 开始绘制不同透明度的多边形线条
$steps = 10;
for ($i = 0; $i <= $steps; $i++) {
$alpha = (int)($i * (127 / $steps)); // alpha 从0(不透明)到127(全透明)
$color = imagecolorallocatealpha($image, 255, 0, 0, $alpha); // 红色,带不同的透明度
// 计算缩放后的点
$scaledPoints = [];
foreach ($points as $index => $coord) {
$offset = 5 * $i;
if ($index % 2 == 0) { // x 坐标
$scaledPoints[] = $coord + $offset;
} else { // y 坐标
$scaledPoints[] = $coord + $offset;
}
}
imageopenpolygon($image, $scaledPoints, count($scaledPoints) / 2, $color);
}
// 输出图片
header('Content-Type: image/png');
imagepng($image);
// 销毁资源
imagedestroy($image);
?>
这段代码通过循环,每次稍微扩大多边形并降低透明度,从而实现从中心向外发散的半透明渐变效果。由于 imageopenpolygon() 绘制的是开放式多边形,所以中间不会出现实心填充,保持了非常细腻的渐变线条感。
如果你想要查看最终效果,可以将上面的代码保存为 .php 文件并上传到你的服务器,例如:
https://m66.net/demo/transparent_polygon.php
(请记得将服务器配置好 PHP 环境,并确保 GD 库已启用。)
imagesavealpha($image, true) 一定要调用,否则输出时透明信息不会被保存。
imagecolorallocatealpha() 的最后一个参数是 alpha 值,范围是 0(完全不透明)到 127(完全透明)。
PHP 8.0 起,GD 库的对象模型改了,注意版本差异。
使用 imageopenpolygon() 配合 alpha 渐变,其实可以非常轻松地实现半透明、多层次的线条绘制效果。这种技术不仅可以用于绘制炫酷的 UI 组件,还可以用于生成动态背景、特效图形等,非常实用。