• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imagesetstyle()

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

    设定画线的风格

    说明

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

    imagesetstyle()设定所有画线的函数(例如imageline()和imagepolygon())在使用特殊颜色IMG_COLOR_STYLED或者用IMG_COLOR_STYLEDBRUSHED画一行图像时所使用的风格。

    参数

    $image

    由图象创建函数(例如imagecreatetruecolor())返回的图象资源。

    $style

    像素组成的数组。你可以通过常量IMG_COLOR_TRANSPARENT来添加一个透明像素。

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    范例

    下面的示例脚本在画布上从左上角到右下角画一行虚线:

    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);
    ?>
    

    以上例程的输出类似于:

    参见

    a shortcut for basic dashed lines, making it easy to adjust the lengths:
    <?php
    $length1 = 20;
    $length2 = 10;
    $style = array_merge(array_fill(0, $length1, $red), array_fill(0, $length2, $w));
    imagesetstyle($im, $style);
    ?>
    
    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.
    To clarify, for lines where the thickness is greater than 1, the total length of the $style array needs to be an exact divisor of the length of the line.
    This is because the pattern is repeated lengthways and wraps onto the second row of pixels, causing staggering to occur.
    So if you have 5 red and 5 white pixels, and you want a line length of 55 pixels, either change the length to a multiple of 10, or change the dashes to, say, 6 red and 5 white.
    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
    ?>
    
    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.
    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;
    }
    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;
    }
    ?>