imagerectangle

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

imagerectangle绘制矩形

描述

imagerectangle(
    GdImage $image,
    int $x1,
    int $y1,
    int $x2,
    int $y2,
    int $color
): bool

imagerectangle() 在指定的坐标处创建一个矩形。

参数

image

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

x1

左上角 x 坐标。

y1

左上角 y 坐标,0, 0 是图像的左上角。

x2

右下角 x 坐标。

y2

右下角 y 坐标。

color

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

返回值

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

变更日志

版本 描述
8.0.0 image 现在需要一个 GdImage 实例;以前需要一个有效的 gd resource

示例

示例 #1 简单 imagerectangle() 示例

<?php
// 创建一个 200 x 200 的图像
$canvas = imagecreatetruecolor(200, 200);

// 分配颜色
$pink = imagecolorallocate($canvas, 255, 105, 180);
$white = imagecolorallocate($canvas, 255, 255, 255);
$green = imagecolorallocate($canvas, 132, 135, 28);

// 绘制三个矩形,每个矩形都有自己的颜色
imagerectangle($canvas, 50, 50, 150, 150, $pink);
imagerectangle($canvas, 45, 60, 120, 100, $white);
imagerectangle($canvas, 100, 120, 75, 160, $green);

// 输出并释放内存
header('Content-Type: image/jpeg');

imagejpeg($canvas);
imagedestroy($canvas);
?>

上面的示例将输出类似于

Output of example : Simple imagerectangle() example

添加注释

用户贡献的注释 7 个注释

stanislav dot eckert at vizson dot de
9 年前
如果您想绘制像素完美的矩形,请注意:由于此函数对第二个坐标点使用绝对值(而不是宽度和高度),因此您可能会遇到逻辑问题。PHP 从 0 开始计数。但位置 0,0 处的像素已经占据了 1x1 的空间。在上面的示例中,您有以下行

imagerectangle($canvas, 50, 50, 150, 150, $pink);

如果您不注意,您可能会认为两个坐标之间的差值恰好是 100,并假设绘制的矩形也具有 100 x 100 像素的尺寸。但它将是 101 x 101,因为 PHP 从 0 开始计数,而 imagerectangle() 对第二个点也使用绝对坐标。更小的示例:坐标为 0,0 和 5,5 的矩形意味着 0,1,2,3,4,5,也就是 6 个像素,而不是 5 个。
eustaquiorangel at yahoo dot com
21 年前
如果您想要一个空矩形,我的意思是,只有边框,请先使用 ImageFilledRectangle 函数以背景色填充它,然后使用此函数绘制它。
rogier
17 年前
除了 Corey 的注释外,这是他所说的代码类型。请注意,我总是绘制一个外部网格边框,因此绘制线条将始终需要
1 + ceil((rows+cols)/2) 个操作。对于 20X20 网格,这意味着 21 个操作,10X25 网格需要 19 个操作

<?php

function draw_grid(&$img, $x0, $y0, $width, $height, $cols, $rows, $color) {
//绘制外框
imagerectangle($img, $x0, $y0, $x0+$width*$cols, $y0+$height*$rows, $color);
//首先绘制水平线
$x1 = $x0;
$x2 = $x0 + $cols*$width;
for (
$n=0; $n<ceil($rows/2); $n++) {
$y1 = $y0 + 2*$n*$height;
$y2 = $y0 + (2*$n+1)*$height;
imagerectangle($img, $x1,$y1,$x2,$y2, $color);
}
//然后绘制垂直线
$y1 = $y0;
$y2 = $y0 + $rows*$height;
for (
$n=0; $n<ceil($cols/2); $n++) {
$x1 = $x0 + 2*$n*$width;
$x2 = $x0 + (2*$n+1)*$width;
imagerectangle($img, $x1,$y1,$x2,$y2, $color);
}
}

//示例
$img = imagecreatetruecolor(300, 200);
$red = imagecolorallocate($img, 255, 0, 0);
draw_grid($img, 0,0,15,20,20,10,$red);
header("Content-type: image/png");
imagepng($img);
imagedestroy($img);
?>
玩得开心!)
administrador(ensaimada)sphoera(punt)com
18 年前
<?php
// 使用此函数,您可以绘制具有透明颜色的圆角矩形。
// 也允许空(未填充)图形!

function draw_roundrectangle($img, $x1, $y1, $x2, $y2, $radius, $color,$filled=1) {
if (
$filled==1){
imagefilledrectangle($img, $x1+$radius, $y1, $x2-$radius, $y2, $color);
imagefilledrectangle($img, $x1, $y1+$radius, $x1+$radius-1, $y2-$radius, $color);
imagefilledrectangle($img, $x2-$radius+1, $y1+$radius, $x2, $y2-$radius, $color);

imagefilledarc($img,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color, IMG_ARC_PIE);
imagefilledarc($img,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color, IMG_ARC_PIE);
imagefilledarc($img,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color, IMG_ARC_PIE);
imagefilledarc($img,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color, IMG_ARC_PIE);
}else{
imageline($img, $x1+$radius, $y1, $x2-$radius, $y1, $color);
imageline($img, $x1+$radius, $y2, $x2-$radius, $y2, $color);
imageline($img, $x1, $y1+$radius, $x1, $y2-$radius, $color);
imageline($img, $x2, $y1+$radius, $x2, $y2-$radius, $color);

imagearc($img,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color);
imagearc($img,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color);
imagearc($img,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color);
imagearc($img,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color);
}
}

?>
更多函数请访问 http://www.sphoera.com
matt at bargolf dot net
18 年前
不要用本森先生的方式来做,好吗!

我敢肯定,如果我需要在纸上画一个 10x10 的网格,我不会通过画 100 个单独的正方形来完成,这样会几乎重复一半的线条。

我可能会通过画 11 条垂直线和 11 条水平线来完成。

function ImageGrid2(&$im,$startx,$starty,$width,$height,$xcols,$yrows,&$color) {
$endy = $starty + $height * $yrows;
for ( $x=0; $x <= $xcols; $x++ ) {
$x1 = $startx + $width * $x;
imageline ( $im, $x1, $starty, $x1, $endy, $color );
}

$endx = $startx + $width * $xcols;
for ( $y=0; $y <= $yrows; $y++ ) {
$y1 = $starty + $height * $y;
imageline ( $im, $startx, $y1, $endx, $y1, $color );
}
}
carl at pappenheim dot net
18 年前
哦,我不知道。他走在正确的轨道上..

<?php

$rows
= 5;
$cols = 11;
$eachx = 12;
$eachy = 18;

$max = array($cols*$eachx, $rows*$eachy);
$im = imagecreatetruecolor($max[0]+1,$max[1]+1);
$white = imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$white);

$black = imagecolorallocate($im,50,50,50);

for(
$x=$max[0]/2;$x>=0;$x-=$eachx) {
imagerectangle($im, ($max[0]/2)+$x,0, ($max[0]/2)-$x,$max[1], $black);
}
for(
$y=$max[1]/2;$y>=0;$y-=$eachy) {
imagerectangle($im, 0,($max[1]/2)+$y, $max[0],($max[1]/2)-$y, $black);
}

header("Content-type: image/jpeg");
imagejpeg($im,'',80);
imagedestroy($im);
?>
Corey
17 年前
Matt,

我同意,为一个 10x10 的方块绘制 100 个方框是荒谬的。但是,如果我们要谈论在 GD 中绘制它的最佳方式,你仍然错了。

由于矩形可以在一次绘制中绘制两条垂直线,因此我们应该利用它的优势。你可以绘制 5 个矩形,它们的顶部和底部在图像之外,这样就有了十行。再绘制 5 个矩形,它们的边在图像之外,这样就有了十列。我们只用 10 次绘制操作就绘制了 10x10(你也可以绘制 11x11)网格。

:)
To Top