小心!如果您向 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); // 图片,起始 x,起始 y,结束 x,结束 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;
}