PHP Conference Japan 2024

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中创建使用color填充的矩形,从点1开始到点2结束。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 resource

范例

示例 #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
12年前
我想清除图像,并将其设置为完全透明。
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
[email protected]
23年前
需要注意的重要特性

虽然`imagerectangle`允许你使用不同的坐标顺序(例如,左下到右上),但`imagefilledrectangle`只有在使用文档中指示的左上到右下顺序时才能正常工作。
[email protected]
18年前
谢谢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
11年前
使用矩形填充的问题是由你的代码在渲染填充矩形之前启用了 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);
?>
[email protected]
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);

?>
[email protected]
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);


谢谢
[email protected]
19年前
从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
14年前
看起来点之间有波浪,但实际上是直的。

<?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