Be aware that styles are applied towards the width of the line instead of linear.
To convert a style to be used for thick lines you can use the function below:
<?php
/*
ImageStyleThicken(<aStyle>,<iThickness>) --> <aThickStyle>
<aStyle> is the style array for a thickness of 1 (see imagesetstyle()).
<iThickness> is the new thickness to apply (see imagesetthickness()).
<aThickStyle> is the style array suitable for the given thickness.
*/
function ImageStyleThicken($_1,$_2) {
$a = array();
foreach ($_1 as $x) {
$i = $_2;
do $a[] = $x; while (--$i>0); }
return $a;
}
?>
imagesetstyle
(PHP 4 >= 4.0.6, PHP 5)
imagesetstyle — 線描画用のスタイルを設定する
説明
bool imagesetstyle
( resource
$image
, array $style
)imagesetstyle() は、特別な IMG_COLOR_STYLED または色を有するイメージの線 IMG_COLOR_STYLEDBRUSHED を描画する際に (imageline() と imagepolygon() のような) 全ての線描画関数で使用されるスタイルを設定します。
パラメータ
-
image -
imagecreatetruecolor() のような画像作成関数が返す画像リソース。
-
style -
はピクセルの配列です。定数
IMG_COLOR_TRANSPARENTを使用すると、透明なピクセルを追加できます。
返り値
成功した場合に 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);
/* imagesetstyle を併用した imagesetbrush() を使用して happy face の線を描画します */
$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);
?>
上の例の出力は、 たとえば以下のようになります。
php at imperium dot be
06-Aug-2010 07:05
Wander
13-Dec-2007 11:12
Function to make a line with random fading:
<?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
?>
Michael_Todd_335 at yahoo dot com
27-Jun-2007 09:40
Watch out! If you pass imagesetstyle() an empty array as the second argument, it will crash your server!
I was messing with it just earlier and accidentally did so, and the page took a good minute to process, when my Apache server came up with the good ol' Windows 'Send Error Report' window.
Cruz at FtUC dot net
15-Jan-2006 03:45
When lines drawn with imagesetstyle seem to produce a thin white line only, make sure antialiasing is disabled.
<?
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 and Antialias don't go together.
zackbloom at gmail dot com
06-Dec-2005 02:44
Use this to set the style to any combination of pixels.
You can pass as many modifiers as you wish.
Use the format [num]r[red]g[green]b[blue].
For example:
$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;
}
yhoko at yhoko dot com
11-Aug-2004 06:24
When drawing lines that are >1px thick you'll have to setup the array corresponding to this fact (since there's no multi-array support for this function).
For example if the line's 3 pixels thick each 2nd color goes to the 2nd line, each 3rd color to the 3rd line and so on.
