imagefilledrectangle

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

imagefilledrectangle绘制填充矩形

描述

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

在给定的 image 中,从点 1 开始,到点 2 结束,创建用 color 填充的矩形。0, 0 是图像的左上角。

参数

image

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

x1

点 1 的 x 坐标。

y1

点 1 的 y 坐标。

x2

点 2 的 x 坐标。

y2

点 2 的 y 坐标。

color

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

返回值

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

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd 资源

示例

示例 #1 imagefilledrectangle() 用法

<?php
// 创建一个 55x30 的图像
$im = imagecreatetruecolor(55, 30);
$white = imagecolorallocate($im, 255, 255, 255);

// 绘制白色矩形
imagefilledrectangle($im, 4, 4, 50, 25, $white);

// 保存图像
imagepng($im, './imagefilledrectangle.png');
imagedestroy($im);
?>

上面的示例将输出类似于

Output of example : imagefilledrectangle()

添加注释

用户贡献的注释 14 个注释

michal dot kocarek at seznam dot cz
20 年前
如果您想绘制一个圆角矩形,可以使用此简单函数...
矩形从 x1y1 开始,到 x2y2 结束。$radius 定义圆角的半径。

<?

function ImageRectangleWithRoundedCorners(&$im, $x1, $y1, $x2, $y2, $radius, $color) {
// 绘制无角的矩形
imagefilledrectangle($im, $x1+$radius, $y1, $x2-$radius, $y2, $color);
imagefilledrectangle($im, $x1, $y1+$radius, $x2, $y2-$radius, $color);
// 绘制圆角
imagefilledellipse($im, $x1+$radius, $y1+$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x2-$radius, $y1+$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x1+$radius, $y2-$radius, $radius*2, $radius*2, $color);
imagefilledellipse($im, $x2-$radius, $y2-$radius, $radius*2, $radius*2, $color);
}

?>
olivier dot pons at google dot mail dot com
11 年前
我想清除一个图像,并将其设置为完全透明。
imagefilledrectangle() 似乎忽略了 alpha 通道和 alpha 混合。
改用 imagefill()

<?php
$w
= imagesx($final);
$h = imagesy($final);
$grande = imagecreatetruecolor($w, $h);

// 启用 alpha 混合以使用 alpha 通道
imagealphablending($grande, true);
// 分配一个透明颜色并用它填充新图像。
// 没有它,图像将具有黑色背景,而不是
// 透明。
$transparent = imagecolorallocatealpha($grande, 0, 0, 0, 127);
// 透明 alpha 将被_忽略_:
imagefilledrectangle($grande, 0, 0, $w, $h, $transparent);
// 好的,透明将被使用,并将整个 alpha 通道设置为透明:
imagefill($grande, 0, 0, $transparent);
?>
administrador(ensaimada)sphoera(punt)com
18 年前
我创建了一个函数来制作全色渐变

<?php

// 图片必须为真彩色模式!!
function gradient_region($img, $x, $y, $width, $height,$src_color, $dest_color=0){
$src_alpha = ($src_color) >> 24;
$src_red = ($src_color & 0xFF0000) >> 16;
$src_green = ($src_color & 0x00FF00) >> 8;
$src_blue = ($src_color & 0x0000FF);

$dest_alpha = ($dest_color) >> 24;
$dest_red = ($dest_color & 0xFF0000) >> 16;
$dest_green = ($dest_color & 0x00FF00) >> 8;
$dest_blue = ($dest_color & 0x0000FF);


$inc_alpha = ($dest_alpha - $src_alpha) / $width;
$inc_red = ($dest_red - $src_red)/$width;
$inc_green = ($dest_green - $src_green)/$width;
$inc_blue = ($dest_blue - $src_blue)/$width;

// 如果你需要更高性能,可以增加步长
for ($i=0;$i<$width;$i++){
$src_alpha += $inc_alpha;
$src_blue += $inc_blue;
$src_green += $inc_green;
$src_red += $inc_red;
imagefilledrectangle($img,
$x+$i,$y,
$x+$i,$y+$height,
imagecolorallocatealpha($img,
$src_red,$src_green,$src_blue,$src_alpha));
}
}
?>

更多功能请访问 http://www.sphoera.com
saramg at uclink dot berkeley dot edu
22 年前
需要注意的重要一点

虽然 imagerectangle 允许您使用不同的坐标顺序(例如从左下角到右上角),但 imagefilledrectangle 只有在您使用文档中指示的从左上角到右下角时才能正常工作。
info at 555webdesign dot com
17 年前
感谢 terereese。我花了两个多小时才弄明白这一点。
它在本地工作:imagefilledrectangle(imagresource, int x1, int x2, int y1, inty2, color)

但远程在我的提供商上只有这个工作:imagefilledrectangle(imagresource, int x1, int y2, int x1, inty1, color)

有什么想法吗?
Google
17 年前
<?php
//index.php
//set your year, month, daym hour, minute, second you want to cuuntdown to.

//ONLY CHANGE FROM HERE
$year="2006";
$month="12";
$day="25";
$hour="00";
$minute="00";
$second="00";
$event="Christmas Day 2006";

$time=mktime($hour, $minute, $second, $month, $day, $year);

$timecurrent=date('U');
$cdtime=$time-$timecurrent;
$cdmonths=$cddays/30;
$cdyears=$cddays/365;

//Used this case only...
$cdminutes=round($cdtime/60);
//cdtime is seconds
$cdhours=round($cdtime/3600);
$cddays=round($cdhours/24);

//String the date
$currentdate = date('l, F j, Y');
// Set the content-type
header("Content-type: image/png");

// Create the image
$im = imagecreatetruecolor(701, 355);

//Temp BGCOLOR (center of c-finder)
$bg1 = 208;
$bg2 = 130;
$bg3 = 208;

$s1 = $bg1 - 20;
$s2 = $bg2 - 20;
$s3 = $bg3 - 20;

$t1 = $bg1 + 30;
$t2 = $bg2 + 30;
$t3 = $bg3 + 30;

$cArray=array();
$c1 = imagecolorallocate($im, $bg1, $bg2, $bg3); //Background
$c8 = imagecolorallocate($im, 255, $bg2, 255); //Background
$c2 = imagecolorallocate($im, $s1, $s2, $s3); //Shadow
$c3 = imagecolorallocate($im, $t1, $t2, $t3); //Text

imagefilledrectangle($im, 0, 0, 701, 50, $c1);

imagefilledrectangle($im, 0, 0, 701, 50, $c8);

// The text to draw
$text = $string;
// Replace path by your own font path
$fnum = rand(1, 9);
$font = "/f/font ($fnum)";

// Add some shadow to the text
imagettftext($im, 29, 1, 17, 42, $c2, $font, "Today is:");
imagettftext($im, 28, -1, 15, 40, $c3, $font, "Today is:");
imagettftext($im, 29, 1, 17, 92, $c2, $font, "...$currentdate...");
imagettftext($im, 28, -1, 15, 90, $c3, $font, "...$currentdate...");
imagettftext($im, 29, 1, 17, 142, $c2, $font, "So there are exactly:");
imagettftext($im, 28, -1, 15, 140, $c3, $font, "So there are exactly:");
imagettftext($im, 29, 1, 17, 192, $c2, $font, "$cddays with just...");
imagettftext($im, 28, -1, 15, 190, $c3, $font, "$cddays days with just...");
imagettftext($im, 29, 1, 17, 242, $c2, $font, "$cdminutes minutes and only...");
imagettftext($im, 28, -1, 15, 240, $c3, $font, "$cdminutes minutes and only...");
imagettftext($im, 29, 1, 17, 292, $c2, $font, "$cdseconds seconds until...");
imagettftext($im, 28, -1, 15, 290, $c3, $font, "$cdseconds seconds until...");
imagettftext($im, 29, 1, 17, 342, $c2, $font, "- + $event + -");
imagettftext($im, 28, -1, 15, 340, $c3, $font, "- + $event + -");

// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>
Darren Edale
10 年前
使用矩形填充的问题是由您的代码在渲染填充矩形之前打开 alpha 混合引起的。alpha 混合会导致您在图像上绘制的内容根据每个的 alpha 通道与图像上已有的内容混合。因此,由于混合已打开,并且因为矩形的填充颜色完全透明,所以现有的图像内容与透明矩形的混合不会对现有的图像造成任何改变。

关闭混合后,在绘制到图像时,您绘制的内容会完全替换已有的内容。因此,在这种情况下绘制矩形会导致图像的原始内容被完全替换为透明矩形。

所以为了使用 imagefilledrectangle() 将图像擦除到透明度,您首先需要关闭 alpha 混合。

我想 imagefill() 在 alpha 混合打开的情况下工作的原因是它不会执行任何 alpha 混合——它总是无论设置如何都无需 alpha 混合。我怀疑这是由于 alpha 通道使边缘检测变得复杂。

我建议使用 imagefilledrectangle() 来创建一个空白的透明图像资源,而不是 imagefill(),因为它在几乎所有情况下无疑都要快得多。

以下是一些将图像空白到透明的示例代码,假设 $im 是一个成功创建的图像

<?php
$transparent
= imagecolorallocatealpha($im, 0, 0, 0, 127);
imagealphablending($im, false);
imagefilledrectangle($im, 0, 0, imagesx($im) - 1, $imagesy($im) - 1, $transparent);
imagecolordeallocate($transparent);
imagealphablending($im, true);
?>
mike at delenk dot net
16 年前
imagettfbbox() 函数中的示例由于对文本在框中的定位方式的误解而给我带来了很多问题。

所以我做了一个新的示例
- 编写文本
- 在其框中的正确位置
- 周围有填充

享受!
Mike

<?

// 一些设置
$angle = 0;
$text = 'Ühg 0123456789';
$font_face = dirname(__FILE__).'/verdana.ttf'; // 将文件放到同一个目录中
$font_size = 9; //(int) 在 GD 1 中为像素,在 GD 2 中为点

// 获取框框架
$box = imagettfbbox($font_size, 0, $font_face, $text);
$bottom_left_x = $box[0]; // 在下面使用
$bottom_left_y = $box[1]; // 在下面使用
$bottom_right_x = $box[2]; // 在下面使用
$bottom_right_y = $box[3];
$top_right_x = $box[4];
$top_right_y = $box[5];
$top_left_x = $box[6];
$top_left_y = $box[7]; // 在下面使用

// 定义文本框的宽度和高度
$box_w = abs($bottom_left_x) + abs($bottom_right_x);
$box_h = abs($bottom_left_y) + abs($top_left_y);

// 添加填充
$padding_x = 5;
$padding_y = 5;
$box_w = $box_w + 2 * $padding_x;
$box_h = $box_h + 2 * $padding_y;

// 文本的起点 = 第一个字符的基线
$text_x = abs($bottom_left_x) -1 + $padding_x;
$text_y = $box_h -1 - abs($bottom_left_y) - $padding_y;

// 对像 pgjq 这样向下延伸的字符的神秘修正
if(abs($bottom_left_y) <= 1) $box_h--;

// 创建图像
$img = imagecreatetruecolor($box_w, $box_h);

// 定义一些颜色
$white = imagecolorallocate($img,255,255,255);
$black = imagecolorallocate($img,0,0,0);
$lightgrey = imagecolorallocate($img, 200, 200, 200);
$grey = imagecolorallocate($img,100,100,100);
$yellow = imagecolorallocate($img, 0xFF, 0xFF, 0x00);

// 属性颜色
$font_color = $black;
$padding_color = $lightgrey;
$background_color = $yellow;

// 用背景颜色填充图像
imagefill($img, 0, 0, $background_color);

// 用填充颜色填充图像
imagefilledrectangle($img, 0, 0, $box_w, $padding_y - 1, $padding_color); // 顶部
imagefilledrectangle($img, 0, 0, $padding_x - 1, $box_h - 1, $padding_color); // 左侧
imagefilledrectangle($img, 0, $box_h - $padding_y -1, $box_w, $box_h - 1, $padding_color); // 底部
imagefilledrectangle($img, $box_w - $padding_x, 0, $box_w - 1, $box_h - 1, $padding_color); // 右侧

// 编写文本
imagettftext($img, $font_size, 0, $text_x, $text_y, $font_color, $font_face, $text);

// 旋转图像
if ($angle > 0) $img = imagerotate($img, $angle, $white);

// 发送头部
header("Content-type: image/gif");

// 发送图像
imagegif($img);
imagedestroy($img);
?>
booga
20 年前
使用 imagerectangle 创建百分比条的一种简单方法

<?php
// 这段代码需要放在它自己的 php 页面中
// 你可以在你的 html 页面中包含这个 php 页面,就像包含一个图片一样:
// <IMG SRC="ratingpng.php?rating=25.2" border="0">

function drawRating($rating) {
$image = imagecreate(102,10);
$back = ImageColorAllocate($image,255,255,255);
$border = ImageColorAllocate($image,0,0,0);
$red = ImageColorAllocate($image,255,60,75);
$fill = ImageColorAllocate($image,44,81,150);
ImageFilledRectangle($image,0,0,101,9,$back);
ImageFilledRectangle($image,1,1,$rating,9,$fill);
ImageRectangle($image,0,0,101,9,$border);
imagePNG($image);
imagedestroy($image);
}

Header("Content-type: image/png");
drawRating($rating);

?>
terereese at hotmail dot com
18 年前
我想告知开发者,我在尝试使用 imagefilledrectangle 时遇到了一个问题。

我注意到,起始和结束 y 坐标的顺序非常重要。
就像下面的语句一样。
if($this->d_values[$i]['unit_value'] < 0)
imagefilledrectangle($this->img,$position_x, $start_y , $end_x, $end_y ,$d_color);
else
imagefilledrectangle($this->img, $position_x,$ end_y , $end_x, $start_y,$d_colour);


谢谢
me [a.t.] forestfactory [d.o.t.] de
18 年前
从 PHP 5 开始,似乎不再需要从左上角绘制到右下角。这让我在将 PHP 5 下开发的脚本移植到 PHP 4 时遇到了大麻烦。
Mice32
14 年前
该脚本绘制了谢尔宾斯基地毯

<?php
set_time_limit
(5);

$i = 4; // 迭代次数
$xy = 500; // 图片大小

$img = imagecreatetruecolor($xy, $xy);

$white = imagecolorallocate($img, 255, 255, 255);

drawCarpet(0, 0, $xy, $xy, $i);
function
drawCarpet($a, $b, $c, $d, $n) {
global
$img, $white;

if(
$n <= 0) return;

$a1 = 2 * $a / 3 + $c / 3;
$c1 = $a / 3 + 2 * $c / 3;
$b1 = 2 * $b / 3 + $d / 3;
$d1 = $b / 3 + 2 * $d / 3;

imagefilledrectangle($img, $a1, $b1, $c1, $d1, $white);

drawCarpet($a, $b, $a1, $b1, $n - 1);
drawCarpet($a1, $b, $c1, $b1, $n - 1);
drawCarpet($c1, $b, $c, $b1, $n - 1);

drawCarpet($c1, $b, $c, $b1, $n - 1);
drawCarpet($a, $b1, $a1, $d1, $n - 1);
drawCarpet($c1, $b1, $c, $d1, $n - 1);

drawCarpet($a, $d1, $a1, $d, $n - 1);
drawCarpet($a1, $d1, $c1, $d, $n - 1);
drawCarpet($c1, $d1, $c, $d, $n - 1);
}

header('Content-Type: image/png');
imagepng($img);
?>
Tobi
13 年前
看起来点之间有波浪,但它是直的。

<?php
$maxwert
= 300;
$size = 10;
$img = imagecreatetruecolor($maxwert, $maxwert);
imagecolorallocate($img, 0, 0, 0);

for(
$y=0;$y<$maxwert;$y += $size){
for(
$x=0;$x<$maxwert;$x+=$size){
$r = rand(0,255);
$g = rand(0,255);
$b = rand(0,255);
$color = imagecolorallocate($img, $r, $g, $b);

imagefilledrectangle ($img, $x, $y, $x+$size ,$y+$size, $color);

}
}
header("Content-type: image/png");
imagepng($img);
?>
ivank at 2xtreme dot net
22 年前
如上所述,它需要从左上角到右下角。如果需要,只需使用此代码翻转。

// 如果需要,翻转它们(x3、y3 是临时变量)
if($x1 > $x2) { $x3 = $x2; $x2 = $x1; $x1 = $x3; }
if($y1 > $y2) { $y3 = $y2; $y2 = $y1; $y1 = $y3; }
ImageFilledRectangle($im, $x1, $y1, $x2, $y2, $color);
To Top