imagefilledpolygon

(PHP 4, PHP 5, PHP 7, PHP 8)

imagefilledpolygon绘制填充多边形

描述

截至 PHP 8.0.0 的签名(不支持命名参数)

imagefilledpolygon(GdImage $image, array $points, int $color): bool

备用签名(自 PHP 8.1.0 起已弃用)

imagefilledpolygon(
    GdImage $image,
    array $points,
    int $num_points,
    int $color
): bool

imagefilledpolygon() 在给定的 image 中创建一个填充多边形。

参数

image

一个 GdImage 对象,由某个图像创建函数返回,例如 imagecreatetruecolor()

points

一个数组,包含多边形顶点的 xy 坐标,依次排列。

num_points

点的总数(顶点),必须至少为 3 个。

如果根据第二个签名省略此参数,points 必须具有偶数个元素,并且 num_points 假设为 count($points)/2
color

使用 imagecolorallocate() 创建的颜色标识符。

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
8.1.0 参数 num_points 已被弃用。
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd resource

范例

示例 #1 imagefilledpolygon() 示例

<?php
// 设置多边形点的数组
$values = array(
40, 50, // 点 1 (x, y)
20, 240, // 点 2 (x, y)
60, 60, // 点 3 (x, y)
240, 20, // 点 4 (x, y)
50, 40, // 点 5 (x, y)
10, 10 // 点 6 (x, y)
);

// 创建图像
$image = imagecreatetruecolor(250, 250);

// 分配颜色
$bg = imagecolorallocate($image, 0, 0, 0);
$blue = imagecolorallocate($image, 0, 0, 255);

// 填充背景
imagefilledrectangle($image, 0, 0, 249, 249, $bg);

// 绘制多边形
imagefilledpolygon($image, $values, 6, $blue);

// 刷新图像
header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

上面的示例将输出类似以下内容

Output of example : imagefilledpolygon()

参见

添加说明

用户贡献说明 9 个说明

martin at eksperimentrum dot dk
6 年前
如何绘制一个简单的 6 角星图像,其中 x,y 是星星的中心,s 是大小

function drawStar($img, $x, $y, $s, $color) {
$x=$x-$s/2;
$y=$y-$s/4;
$points=array($x,$y, $x+$s/2,$y+$s, $x+$s,$y);
imagefilledpolygon($img, $points, 3, $color);
$points=array($x,2/3*$s+$y, $x+$s/2,$y-$s/3, $x+$s,2/3*$s+$y);
imagefilledpolygon($img, $points, 3, $color);
}
Steween
7 年前
我版本的 drawStar(含示例)

<?php
header
("Content-type: image/png");

/* 绘制星形或规则多边形
$x, $y -> 图像中的位置
$radius -> 星形的半径
$spikes -> 尖角的数量 (最小 2 个)
$ratio -> 外部点和内部点之间的比例
$dir -> 旋转 270° 以使尖角朝上 (当比例 < 1 时)
*/
function drawStar($x, $y, $radius, $spikes=5, $ratio=0.5, $dir=270) {
$coordinates = array();
$angle = 360 / $spikes ;
for(
$i=0; $i<$spikes; $i++){
$coordinates[] = $x + ( $radius * cos(deg2rad($dir+$angle*$i)));
$coordinates[] = $y + ( $radius * sin(deg2rad($dir+$angle*$i)));
$coordinates[] = $x + ($ratio*$radius * cos(deg2rad($dir+$angle*$i + $angle/2)));
$coordinates[] = $y + ($ratio*$radius * sin(deg2rad($dir+$angle*$i + $angle/2)));
}
return
$coordinates ;
}

// 14*20+24*2 = 328 个示例
$im = imagecreate(800,600);
imagecolorallocate($im, 0, 0, 0);
$w = imagecolorallocate($im, 255, 255, 255);
$r = imagecolorallocate($im, 255, 0, 0);
for (
$spikes=2; $spikes<16; $spikes++) { //[2-15]
for ($ratio=1; $ratio<21; $ratio++) { //[0.1-2.0]
$values = drawStar(40*$ratio-20, $spikes*40-60, 10, $spikes, $ratio/10);
imagefilledpolygon($im, $values, count($values)/2, ($ratio % 5 == 0) ? $r : $w);
}
}
for (
$dir=0; $dir<24; $dir++) {
$values = drawStar(30*$dir+20, 580, 10, 2, 1.5, $dir*15);
imagefilledpolygon($im, $values, count($values)/2, $w);
$values = drawStar(30*$dir+20, 580, 10, 2, 0.2, $dir*15);
imagefilledpolygon($im, $values, count($values)/2, $r);
}
imagepng($im);
imagedestroy($im);
?>
rbenheidorn at gmail dot com
9 年前
在处理将地理边界打印到图像时发现:如果提供浮点顶点,则会自动截断小数部分。这会导致用浮点顶点绘制的图像略微向左上角偏移。我的个人解决方法是将所有顶点四舍五入到最接近的整数值,这消除了这种偏移。
austinoblouk at yahoo dot com
14 年前
实际上,它允许的最小值为 3。它说“顶点总数,必须大于 3”,但它允许 3...
webmaster at mywebsolution dot de
16 年前
只是认为“tatlar at yahoo dot com”的函数中有一些多余的代码,所以我尝试“改进”它。现在您可以选择可变数量的尖角。

<?php
error_reporting
(E_ALL);
function
drawStar($x, $y, $radius, $spikes=5) {
// $x, $y -> 图片中的位置
// $radius -> 星形的半径
// $spikes -> 尖角的数量

$coordinates = array();
$angel = 360 / $spikes ;

// 获取星星外形的坐标
$outer_shape = array();
for(
$i=0; $i<$spikes; $i++){
$outer_shape[$i]['x'] = $x + ($radius * cos(deg2rad(270 - $angel*$i)));
$outer_shape[$i]['y'] = $y + ($radius * sin(deg2rad(270 - $angel*$i)));
}

// 获取星星内形的坐标
$inner_shape = array();
for(
$i=0; $i<$spikes; $i++){
$inner_shape[$i]['x'] = $x + (0.5*$radius * cos(deg2rad(270-180 - $angel*$i)));
$inner_shape[$i]['y'] = $y + (0.5*$radius * sin(deg2rad(270-180 - $angel*$i)));
}

// 将坐标排列为正确的顺序
foreach($inner_shape as $key => $value){
if(
$key == (floor($spikes/2)+1))
break;
$inner_shape[] = $value;
unset(
$inner_shape[$key]);
}

// 重置键
$i=0;
foreach(
$inner_shape as $value){
$inner_shape[$i] = $value;
$i++;
}

// 合并外形和内形
foreach($outer_shape as $key => $value){
$coordinates[] = $outer_shape[$key]['x'];
$coordinates[] = $outer_shape[$key]['y'];
$coordinates[] = $inner_shape[$key]['x'];
$coordinates[] = $inner_shape[$key]['y'];
}

// 返回坐标
return $coordinates ;
}

// 示例
$spikes = 5;

$values = drawStar(250, 250, 200, $spikes);
$im = imagecreate(500,500);
imagecolorallocate($im,0,0,0);
$w = imagecolorallocate($im, 255, 255, 255);
imagefilledpolygon($im, $values, $spikes*2, $w);
imageGIF($im);
imagedestroy($im);
?>
jylyn at hotmail dot com
17 years ago
尽管它说需要超过 3 个顶点,但使用此函数可以绘制三角形!
etnekor at tar dot hu
18 years ago
有一个简单的函数可以绘制一个填充的点,并可以选择半径和颜色。

<?php
function drawPoint($img, $radius, $origo_x, $origo_y, $pointColor)
{
for (
$i=0;$i<=360;$i++)
{
$pont[] = $origo_x + ($radius * sin(deg2rad($i)));
$pont[] = $origo_y - ($radius * cos(deg2rad($i)));
}
reset($pont);
ImageFilledPolygon ($img, $pont, (sizeof($pont)/2), $pointColor);
}
?>
tatlar at yahoo dot com
17 years ago
<?php function _makeFiveSidedStar( $x, $y, $radius, $shape='polygon', $spiky=NULL ) {
// $x, $y 为原点坐标(以像素为单位),$radius 为半径(以像素为单位),$shape - 'polygon' 或 'star',$spikiness - 尖锐度比例,范围为 0 到 1
$point = array() ;
$angle = 360 / 5 ;
$point[0]['x'] = $x ;
$point[0]['y'] = $y - $radius ;
$point[2]['x'] = $x + ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
$point[2]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
$point[4]['x'] = $x + ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
$point[4]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
$point[6]['x'] = $x - ( $radius * sin( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
$point[6]['y'] = $y + ( $radius * cos( deg2rad( 180 - ( $angle*2 ) ) ) ) ;
$point[8]['x'] = $x - ( $radius * cos( deg2rad( 90 - $angle ) ) ) ;
$point[8]['y'] = $y - ( $radius * sin( deg2rad( 90 - $angle ) ) ) ;
if(
$shape == 'star' ) {
if(
$spiky == NULL ) $spiky = 0.5 ; // 默认设置为 0.5
$indent = $radius * $spiky ;
$point[1]['x'] = $x + ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
$point[1]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
$point[3]['x'] = $x + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
$point[3]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
$point[5]['x'] = $x ;
$point[5]['y'] = $y + ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
$point[7]['x'] = $x - ( $indent * sin( deg2rad( 180 - $angle ) ) ) ;
$point[7]['y'] = $y - ( $indent * cos( deg2rad( 180 - $angle ) ) ) ;
$point[9]['x'] = $x - ( $indent * cos( deg2rad( 90 - $angle/2 ) ) ) ;
$point[9]['y'] = $y - ( $indent * sin( deg2rad( 90 - $angle/2 ) ) ) ;
}
ksort( $point ) ;
$coords = array() ; // 新建数组
foreach( $point as $pKey=>$pVal ) {
if(
is_array( $pVal ) ) {
foreach(
$pVal as $pSubKey=>$pSubVal ) {
if( !empty(
$pSubVal ) ) array_push( $coords, $pSubVal ) ;
}
}
}
return
$coords ;
}
$values = _makeFiveSidedStar( 100, 100, 50, 'star' ) ;
// 将值放入 imagepolygon 函数。您需要定义 $image 和 $color,并将它刷新到图像类型。?>
Arnapou
16 年前
我发现 GD 函数 imagefilledpolygon 在使用透明颜色(例如 50% 的红色:RGBA = 255, 0, 0, 64)绘制时存在错误。

我尝试使用大量的点(距离仅为 1 像素)和透明红色来绘制一个复杂形状。

问题是:一些边界像素没有被 imagefilledpolygon 绘制,但被 imagepolygon 绘制了!??

所以我编写了自己的 imagefilledpolygon 函数,它在我的所有测试案例中都运行良好。

<?php
// $points 应该是一个包含坐标的数组,像这样:
$points = array(
array(
0, 0),
array(
100, 50),
array(
90, 100),
array(
50, 50),
array(
70, 30),
array(
10, 10),
);
?>

<?php
function myimagefilledpolygon(& $img, $points, $color) {
$scanline = 99999;
// 计算边
$all_edges = array();
$n = count($points);
for(
$i=0; $i<$n; $i++) {
$p1 = $points[$i];
if (
$i == $n-1) { $p2 = $points[0]; } else { $p2 = $points[$i+1]; }
$x1 = $p1[0]; $y1 = $p1[1];
$x2 = $p2[0]; $y2 = $p2[1];
if (
$y1 != $y2) {
$invslope = ($x2 - $x1)/($y2 - $y1);
if (
$y1 < $y2 ) {
$ymin = $y1;
$xval = $x1;
$ymax = $y2;
} else {
$ymin = $y2;
$xval = $x2;
$ymax = $y1;
}
$all_edges[] = array($ymin, $ymax, $xval, $invslope);
if (
$ymin < $scanline) { $scanline = $ymin; }
} else {
if (
$y1 < $scanline) { $scanline = $y1; }
if (
$y2 < $scanline) { $scanline = $y2; }
}
}
// 绘制
$active = array();
do {
// 将边添加到活动数组中
$tmp = array();
$n = count($all_edges);
for(
$i=0; $i<$n; $i++) {
if (
$all_edges[$i][0] == $scanline) {
$active[] = $all_edges[$i];
} else {
$tmp[] = $all_edges[$i];
}
}
$all_edges = $tmp;
// 从活动数组中移除先前的边
$tmp = array();
$n = count($active);
for(
$i=0; $i<$n; $i++) {
if (
$active[$i][1] > $scanline) {
$tmp[] = $active[$i];
}
}
$active = $tmp;
// 对活动数组进行排序
$n = count($active);
for(
$i=0; $i<$n-1; $i++) {
$min = $i;
for(
$k=$i+1; $k<$n; $k++) {
if (
$active[$k][2] < $active[$min][2]) { $min = $k; }
}
if (
$i != $min) {
$tmp = $active[$i];
$active[$i] = $active[$min];
$active[$min] = $tmp;
}
}
// 绘制
$n = count($active);
for(
$i=0; $i<$n; $i+=2) {
if (
$i+1 < $n) {
if (
$tmp[$i][2] == $active[$i+1][2]) {
imagesetpixel($img, round($active[$i][2]), $scanline, $color);
} else {
imageline($img, round($active[$i][2]), $scanline, round($active[$i+1][2]), $scanline, $color);
}
}
}
// 增加 x 值
$n = count($active);
for(
$i=0; $i<$n; $i++) { $active[$i][2] += $active[$i][3]; }
$scanline++;
} while (
count($all_edges) + count($active) > 0);
}
?>
To Top