注意!如果您将空数组作为第二个参数传递给 imagesetstyle(),它将导致您的服务器崩溃!
我之前在摆弄它时不小心这么做了,页面花了大约一分钟才处理完,然后我的 Apache 服务器弹出了那个老式的 Windows“发送错误报告”窗口。
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
imagesetstyle — 设置线条绘制样式
imagesetstyle() 设置所有线条绘制函数(例如 imageline() 和 imagepolygon())在使用特殊颜色 IMG_COLOR_STYLED
或使用颜色 IMG_COLOR_STYLEDBRUSHED
的图像线条进行绘制时的样式。
image
一个 GdImage 对象,由图像创建函数(例如 imagecreatetruecolor())返回。
style
像素颜色的数组。您可以使用 IMG_COLOR_TRANSPARENT
常量添加透明像素。请注意,style
不能是空的 array。
以下示例脚本在画布的左上角到右下角绘制一条虚线
示例 #1 imagesetstyle() 示例
<?php
header("Content-type: image/jpeg");
$im = imagecreatetruecolor(100, 100);
$w = imagecolorallocate($im, 255, 255, 255);
$red = imagecolorallocate($im, 255, 0, 0);
/* 绘制一条虚线,5 个红色像素,5 个白色像素 */
$style = array($red, $red, $red, $red, $red, $w, $w, $w, $w, $w);
imagesetstyle($im, $style);
imageline($im, 0, 0, 100, 100, IMG_COLOR_STYLED);
/* 使用 imagesetbrush() 和 imagesetstyle 绘制一行笑脸 */
$style = array($w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $w, $red);
imagesetstyle($im, $style);
$brush = imagecreatefrompng("http://www.libpng.org/pub/png/images/smile.happy.png");
$w2 = imagecolorallocate($brush, 255, 255, 255);
imagecolortransparent($brush, $w2);
imagesetbrush($im, $brush);
imageline($im, 100, 0, 0, 100, IMG_COLOR_STYLEDBRUSHED);
imagejpeg($im);
imagedestroy($im);
?>
以上示例将输出类似以下内容
注意!如果您将空数组作为第二个参数传递给 imagesetstyle(),它将导致您的服务器崩溃!
我之前在摆弄它时不小心这么做了,页面花了大约一分钟才处理完,然后我的 Apache 服务器弹出了那个老式的 Windows“发送错误报告”窗口。
澄清一下,对于线宽大于 1 的线条,$style 数组的总长度需要是线条长度的精确除数。
这是因为图案会沿长度方向重复并包裹到像素的第二行,从而导致交错现象。
所以,如果您有 5 个红色像素和 5 个白色像素,并且想要线条长度为 55 像素,则要么将长度更改为 10 的倍数,要么将虚线更改为例如 6 个红色像素和 5 个白色像素。
一个用于基本虚线的快捷方式,方便调整长度。
<?php
$length1 = 20;
$length2 = 10;
$style = array_merge(array_fill(0, $length1, $red), array_fill(0, $length2, $w));
imagesetstyle($im, $style);
?>
用于创建具有随机渐变的线条的函数。
<?php
function fading_line($img,$sx,$sy,$ex,$ey){
$r=rand(0,5);$g=rand(0,5);$b=rand(0,5);
$l=sqrt((($ex-$sx)*($ex-$sx))+(($ey-$sy)*($ey-$sy)));
for($i=0;$i<$l;$i++){
$a = array(255-((255/$l)*$i), 255,0,(255/$l)*$i/2,(255/$l)*$i,(255-((255/$l)*$i))/2);
$style[]=imagecolorallocate($img,$a[$r],$a[$g],$a[$b]);
}
imagesetstyle($img,$style);
imageline($img,$sx,$sy,$ex,$ey,IMG_COLOR_STYLED);
}
fading_line($img,10,20,490,40); // image, start x, start y, end x, end y
?>
当使用 imagesetstyle 绘制的线条仅显示为细白线时,请确保已禁用抗锯齿。
<?
imageantialias($im, false);
$style = array($gridxcolor, $gridxcolor, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT);
imagesetstyle($im, $style);
imageline($im, $x, 0, $x, $ymax+5, IMG_COLOR_STYLED);
imageantialias($im, true);
?>
Setstyle 和 Antialias 不能一起使用。
请注意,样式是应用于线条宽度而不是线性的。
要转换用于粗线条的样式,可以使用以下函数。
<?php
/*
ImageStyleThicken(<aStyle>,<iThickness>) --> <aThickStyle>
<aStyle> 是线宽为 1 的样式数组(参见 imagesetstyle())。
<iThickness> 是要应用的新线宽(参见 imagesetthickness())。
<aThickStyle> 是适合给定线宽的样式数组。
*/
function ImageStyleThicken($_1,$_2) {
$a = array();
foreach ($_1 as $x) {
$i = $_2;
do $a[] = $x; while (--$i>0); }
return $a;
}
?>
使用此方法将样式设置为任意像素组合。
您可以传递任意数量的修饰符。
使用格式 [num]r[red]g[green]b[blue]。
例如
$im=dashed($im,"4r255g0b0","2r0g255b0","5r0g0b255");
imageline($im, 0, 0, 600, 600, IMG_COLOR_STYLED);
function dashed($im){
$size = func_num_args();
for($i = 0; $i < $size; $i++){
$arg = func_get_arg($i);
if(!is_resource($arg)){
$r=substr($arg,strpos($arg,"r")+1,
strpos($arg,"g")-strpos($arg,"r")-1);
$g=substr($arg,strpos($arg,"g")+1,
strpos($arg,"b")-strpos($arg,"g")-1);
$b=substr($arg,strpos($arg,"b")+1,
strlen($arg)-strpos($arg,"b"));
$color = imagecolorallocate($im,$r,$g,$b);
$x = substr($arg,0,strpos($arg,"r"));
$vals[$i] = array_fill(0,$x,$color);
}
}
for($k=0;$k<count($vals)+1;$k++)
if(array_key_exists($k,$vals)) $prop=array_merge($prop,$vals[$k]);
imagesetstyle($im, $prop);
return $im;
}