imagefill

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

imagefill泛洪填充

描述

imagefill(
    GdImage $image,
    int $x,
    int $y,
    int $color
): bool

image 中从给定的坐标(左上为 0, 0)开始用给定的 color 执行扩散填充。

参数

image

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

x

起始点的 x 坐标。

y

起始点的 y 坐标。

color

填充颜色。通过 imagecolorallocate() 创建的颜色标识符。

返回值

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

更新日志

版本 描述
8.0.0 image 现在需要一个 GdImage 实例;之前,需要一个有效的 gd 资源

示例

示例 #1 imagefill() 示例

<?php

$im
= imagecreatetruecolor(100, 100);

// 将背景设为红色
$red = imagecolorallocate($im, 255, 0, 0);
imagefill($im, 0, 0, $red);

header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>

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

Output of example : imagefill()

另请参阅

添加注释

用户贡献的注释 16 个注释

25
George Edison
11 年前
创建真彩色图像,用透明色填充它,然后将其保存为 PNG 图像,可通过执行以下操作来实现

<?php

$new
= imagecreatetruecolor(320, 320);
$color = imagecolorallocatealpha($new, 0, 0, 0, 127);
imagefill($new, 0, 0, $color);
imagesavealpha($new, TRUE); // 花了 10 分钟才弄清楚这部分
imagepng($new);

?>

该图像需要用 imagecreatetruecolor() 创建,你必须使用 imagefill() 代替 imagefilledrectange(),你需要调用 imagesavealpha()。没有其他函数调用组合看起来能产生目标结果。
7
Christopher Kramer
14 年前
这里有一个生成渐变色的函数。
你指定宽度、高度和 4 种颜色(4 个角)。

将返回一个渐变色图像的图像句柄。
你可以使用 imagecopy 将返回的图像复制到另一图像上。
如果想生成阴影,这很有帮助。
(“发光效果示例”:生成 8 个渐变,每个边一个,每个角一个。渐变的外侧具有背景色,内侧具有白色之类的亮色。)

但请注意:此函数没有针对性能进行优化,在大图像上可能会变慢。对于阴影,最好缓存生成的渐变。

注意:对于渐变,强烈建议使用真彩色。

<?php

function gradient($w=100, $h=100, $c=array('#FFFFFF','#FF0000','#00FF00','#0000FF'), $hex=true) {

/*
Generates a gradient image

Author: Christopher Kramer

Parameters:
w: width in px
h: height in px
c: color-array with 4 elements:
$c[0]: top left color
$c[1]: top right color
$c[2]: bottom left color
$c[3]: bottom right color

if $hex is true (default), colors are hex-strings like '#FFFFFF' (NOT '#FFF')
if $hex is false, a color is an array of 3 elements which are the rgb-values, e.g.:
$c[0]=array(0,255,255);

*/

$im=imagecreatetruecolor($w,$h);

if(
$hex) { // convert hex-values to rgb
for($i=0;$i<=3;$i++) {
$c[$i]=hex2rgb($c[$i]);
}
}

$rgb=$c[0]; // start with top left color
for($x=0;$x<=$w;$x++) { // loop columns
for($y=0;$y<=$h;$y++) { // loop rows
// set pixel color
$col=imagecolorallocate($im,$rgb[0],$rgb[1],$rgb[2]);
imagesetpixel($im,$x-1,$y-1,$col);
// calculate new color
for($i=0;$i<=2;$i++) {
$rgb[$i]=
$c[0][$i]*(($w-$x)*($h-$y)/($w*$h)) +
$c[1][$i]*($x *($h-$y)/($w*$h)) +
$c[2][$i]*(($w-$x)*$y /($w*$h)) +
$c[3][$i]*($x *$y /($w*$h));
}
}
}
return
$im;
}

function
hex2rgb($hex)
{
$rgb[0]=hexdec(substr($hex,1,2));
$rgb[1]=hexdec(substr($hex,3,2));
$rgb[2]=hexdec(substr($hex,5,2));
return(
$rgb);
}

// usage example

$image=gradient(300, 300, array('#000000', '#FFFFFF', '#FF0000', '#0000FF'));

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

?>
2
Gromitt
17 年前
如果你需要填充整个图像(例如,在创建后立即),可以考虑使用 imagefilledrectangle() 应用一个填充矩形

<?php

$gdImage
= imagecreatetruecolor(100, 100);
$gdColor = imagecolorallocate($gdImage, 255, 0, 0); // 红色
imagefilledrectangle($gdImage, 0, 0, 99, 99, $gdColor);

?>

这将需要 GD 进行更少的逻辑处理和运算。
1
pisu at estmail dot hu
18 年前
国际象棋棋盘
<?php

$kep
= imagecreate(400,400);
$fekete = imagecolorallocate($kep,0,0,0);
$feher = imagecolorallocate($kep,255,255,255);

//imagefill($kep,50,50,$fekete);
imagefill($kep,50,20,$feher);

for (
$i=1;$i<8;$i++) {
$k = $i*50;
imageline($kep,0,$k,400,$k,$fekete);
imageline($kep,$k,0,$k,400,$fekete);
}

for (
$i=0;$i<8;$i++) {
for (
$j=0;$j<8;$j++) {
$x = $i*50 + 2;
$y = $j*50 + 2;
if ( ( (
$i % 2) + ($j % 2) ) % 2 == 0 ) {
imagefill($kep,$x,$y,$fekete);
}

}
}

// imagecolortransparent($kek,$piros);

header('content-type : image/png');
imagepng($kep);

?>
0
Cypog
16 年前
imagefill 无法处理 Alpha 颜色,请改用 imagefilledrectangle。

<?php

header
("Content-Type: image/png");
$im = imagecreatefrompng("img/button.png");
if (empty(
$_GET['alpha']))
{
$_GET['alpha'] = 10;}
$color = imagecolorallocatealpha($im, 255, 255, 255, $_GET['alpha']);
imagefillalpha($im, $color);
imagepng($im);
imagedestroy($im);

function
ImageFillAlpha($image, $color)
{
imagefilledrectangle($image, 0, 0, imagesx($image), imagesy($image), $color);
}

?>
0
razonklnbd at yahoo dot com
17 年前
我花费了两个多小时查找一个函数,该函数可以填充图案或文件作为背景,而不是颜色。但我找不到。所以我开发了以下函数。我认为这个函数可以节省需要它的人的时间...

函数将获得四个参数
1. 主图像标识符
2. 图案图像标识符
3. 最终图像宽度
4. 最终图像高度

如果您设置最终图像宽度或高度小于主图像宽度或高度,那么您可能会得到错误的结果

<?php

function fill_with_patternfile($p_main_im, $p_patternfile_im, $p_width, $p_height){
$pimiX=$p_patternfile_im;
$pw=imagesx($pimiX);
$ph=imagesy($pimiX);
$targetImageIdentifier=imagecreatetruecolor($p_width,$p_height);
if(
$pw<$p_width && $ph<$p_height){
for(
$pX=0;$pX<$p_width;$pX+=$pw){
for(
$pY=0;$pY<$p_height;$pY+=$ph){
imagecopy($targetImageIdentifier,$pimiX,$pX,$pY,0,0,$pw,$ph);
}
}
}else
imagecopy($targetImageIdentifier,$pimiX,0,0,0,0,$pw,$ph);
$w=imagesx($p_main_im);
$h=imagesy($p_main_im);
$nX=0;
if(
$w<$p_width) $nX=intval(($p_width-$w)/2);
$nY=0;
if(
$h<$p_height) $nY=intval(($p_height-$h)/2);
imagecopy($targetImageIdentifier,$p_main_im,$nX,$nY,0,0,$w,$h);
return
$targetImageIdentifier;
}
// If you want to use a gif or png file as
// pattern file you need to change function below :)
$pattern_im=imagecreatefromjpeg('logo.jpg');
// If you want to use a gif or png file as
// main file you need to change function below :)
$main_im=imagecreatefromjpeg('r2.jpg');
// call the function width 500 and height 500
// if your width and height is less then main images
// width and height then you can't understand any change!
$final=fill_with_patternfile($main_im, $pattern_im, 500, 500);
// view the image and destroy all instance
header('Content-type: image/jpeg');
imagejpeg($final);
imagedestroy($final);
imagedestroy($main_im);
imagedestroy($pattern_im);
exit();

?>
0
gelak
18 年前
//笑脸 ;]

<?php

header
('Content-type: image/png');

$smile=imagecreate(400,400);
$kek=imagecolorallocate($smile,0,0,255);
$feher=imagecolorallocate($smile,255,255,255);
$sarga=imagecolorallocate($smile,255,255,0);
$fekete=imagecolorallocate($smile,0,0,0);
imagefill($smile,0,0,$kek);

imagearc($smile,200,200,300,300,0,360,$fekete);
imagearc($smile,200,225,200,150,0,180,$fekete);
imagearc($smile,200,225,200,123,0,180,$fekete);
imagearc($smile,150,150,20,20,0,360,$fekete);
imagearc($smile,250,150,20,20,0,360,$fekete);
imagefill($smile,200,200,$sarga);
imagefill($smile,200,290,$fekete);
imagefill($smile,155,155,$fekete);
imagefill($smile,255,155,$fekete);
imagepng($smile);

?>
-1
dunhamzzz [A] gmail
15 年前
我认为值得指出的是,您无法使用 imagecolorallocatealpha 分配的透明颜色进行填充,颜色将填充,但没有透明度,

我认为最简单的解决方法是使用 imagefilledrectangle() 填充矩形以绘制填充。
-1
aqmprod at iname dot com
24 年前
此函数似乎不适用于已经透明的图像。如果您填充 x=0,y=0,并且仍然有您未用填充到达的透明部分,
它们将更改为不同的颜色。

ImageColorSet 函数似乎是解决方案,但我无法使用透明度。
-1
norxh
21 年前
对于新图像,必须在该函数起作用之前分配一个颜色。
-3
oleh at it dot wihola dot com
6 年前
使用 $x 和 $y 坐标有什么意义?它们不会以任何方式影响输出。我现在可以制作一半填充颜色的矩形。这些参数毫无用处。
-3
jonathan dot aquino at gmail dot com
18 年前
使用 imageSaveAlpha($image, true); 保留透明度。
-5
info at educar dot pro dot br
17 年前
示例 1
如果初始坐标在这个区域外面,填充的区域将在这个划定区域的外部。

<?php
$src621
= imagecreate(200,200);
$clr_1_621 = imagecolorallocate($src621, 255, 255, 0);
$clr_2_621 = imagecolorallocate($src621, 0, 0, 250);
$clr_4_621 = imagecolorallocate($src621, 2,2,55);
imagerectangle($src621, 100, 100, 150, 150, $clr_4_621);
imagefill($src621, 110, 110, $clr_2_621);
header("Content-Type: image/png");
imagepng ($src621);
imagedestroy($src621);
?>

示例 2
如果初始坐标在这个分界区域内,填满区域会在这个分界区域内。
<?php
$src622
= imagecreate(200,200);
$clr_1_622 = imagecolorallocate($src622, 255, 255, 0);
$clr_2_622 = imagecolorallocate($src622, 0, 0, 250);
$clr_4_622 = imagecolorallocate($src622, 2,2,55);
imagerectangle($src622, 100, 100, 150, 150, $clr_4_622);
imagefill($src622, 10, 10, $clr_2_622);
header("Content-Type: image/png");
imagepng ($src622);
imagedestroy($src622);
?>

请参阅其他示例,网址为
http://www.educar.pro.br/a/gdlib/index.php?pn=50&tr=97
-3
colin at galaxyinteractive dot net
19 年前
没有看到此记录,尽管它已在 imagefilledrectangle 中概述,但最初我不是很清楚

imageSetTile($image,$imageBack);
imagefill($image,0,0,IMG_COLOR_TILED);

将用纹理填充图像(这非常好,因为我正在构建徽标/模板创建器)
-3
Igor Garcia
21 年前
此功能不能处理透明度。
因此,需要使用 imagecolorallocate 而不是 imagecolorallocatealpha。
因此,请小心使用已通过 imageallocatecoloralpha 设置的所有颜色变量,因为这可能减慢或挂起系统。
-3
Anonymous
21 年前
实际上,它可以处理预透明的图像。要将其删除,需要执行类似以下操作
imagecolortransparent($img, 0);
将以前的透明度颜色设为 null。;)
To Top