imagesetstyle

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

imagesetstyle设置线绘制样式

描述

imagesetstyle(GdImage $image, array $style): bool

imagesetstyle() 设置所有线绘制函数(如 imageline()imagepolygon())在使用特殊颜色 IMG_COLOR_STYLED 或具有颜色 IMG_COLOR_STYLEDBRUSHED 的图像线条进行绘制时要使用的样式。

参数

image

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

style

一个像素颜色的数组。您可以使用 IMG_COLOR_TRANSPARENT 常量来添加一个透明像素。注意,style 不能是空的 array

返回值

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

示例

以下示例脚本从画布的左上角绘制一条虚线到右下角

示例 #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);
?>

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

Output of example : imagesetstyle()

参见

添加注释

用户贡献的注释 7 个注释

Michael_Todd_335 at yahoo dot com
17 年前
小心!如果您向 imagesetstyle() 传递一个空数组作为第二个参数,它将使您的服务器崩溃!
我之前刚在玩它,不小心这么做了,页面花了将近一分钟才处理完,然后我的 Apache 服务器弹出了 Windows 的“发送错误报告”窗口。
dazbert
7 年前
为了说明,对于厚度大于 1 的线条,$style 数组的总长度需要是线条长度的精确除数。

这是因为模式在长度方向上重复,并包裹到第二行像素,导致出现交错现象。

因此,如果您有 5 个红色像素和 5 个白色像素,并且您想要一条长度为 55 像素的线,那么要么将长度更改为 10 的倍数,要么将虚线更改为例如 6 个红色像素和 5 个白色像素。
匿名
11 年前
用于基本虚线的快捷方式,便于调整长度

<?php

$length1
= 20;
$length2 = 10;
$style = array_merge(array_fill(0, $length1, $red), array_fill(0, $length2, $w));
imagesetstyle($im, $style);

?>
Wander
16 年前
用于创建带有随机渐变的线条的函数

<?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
?>
Cruz at FtUC dot net
18 年前
当使用 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 at imperium dot be
14 年前
请注意,样式是应用于线条的宽度而不是线性。
要转换要用于粗线的样式,可以使用以下函数

<?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;
}
?>
zackbloom at gmail dot com
18 年前
使用此方法将样式设置为任何像素组合。
您可以传递任意数量的修饰符。
使用格式 [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;
}
To Top