• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ImagickDraw::bezier()

    (PECL imagick 2.0.0)

    Draws a bezier curve

    说明

    ImagickDraw::bezier(array $coordinates): bool
    Warning

    本函数还未编写文档,仅有参数列表。

    Draws a bezier curve through a set of points on the image.

    参数

    $coordinates

    Multidimensional array like array(array('x'=> 1,'y'=> 2), array('x'=> 3,'y'=> 4))

    返回值

    没有返回值。

    范例

    Example #1 ImagickDraw::bezier()

    <?php
    function bezier($strokeColor, $fillColor, $backgroundColor) {
        $draw = new \ImagickDraw();
        $strokeColor = new \ImagickPixel($strokeColor);
        $fillColor = new \ImagickPixel($fillColor);
        $draw->setStrokeOpacity(1);
        $draw->setStrokeColor($strokeColor);
        $draw->setFillColor($fillColor);
        $draw->setStrokeWidth(2);
        $smoothPointsSet = [
            [
                ['x' => 10.0 * 5, 'y' => 10.0 * 5],
                ['x' => 30.0 * 5, 'y' => 90.0 * 5],
                ['x' => 25.0 * 5, 'y' => 10.0 * 5],
                ['x' => 50.0 * 5, 'y' => 50.0 * 5],
            ], 
            [
                ['x' => 50.0 * 5, 'y' => 50.0 * 5],
                ['x' => 75.0 * 5, 'y' => 90.0 * 5],
                ['x' => 70.0 * 5, 'y' => 10.0 * 5],
                ['x' => 90.0 * 5, 'y' => 40.0 * 5],
            ],
        ];
        foreach ($smoothPointsSet as $points) {
            $draw->bezier($points);
        }
        $disjointPoints = [
            [
                ['x' => 10 * 5, 'y' => 10 * 5], 
                ['x' => 30 * 5, 'y' => 90 * 5], 
                ['x' => 25 * 5, 'y' => 10 * 5],
                ['x' => 50 * 5, 'y' => 50 * 5],
            ],
            [
                ['x' => 50 * 5, 'y' => 50 * 5], 
                ['x' => 80 * 5, 'y' => 50 * 5],
                ['x' => 70 * 5, 'y' => 10 * 5],
                ['x' => 90 * 5, 'y' => 40 * 5],
             ]
        ];
        $draw->translate(0, 200);
        foreach ($disjointPoints as $points) {
            $draw->bezier($points);
        }
        //Create an image object which the draw commands can be rendered into
        $imagick = new \Imagick();
        $imagick->newImage(500, 500, $backgroundColor);
        $imagick->setImageFormat("png");
        //Render the draw commands in the ImagickDraw object 
        //into the image.
        $imagick->drawImage($draw);
        //Send the image to the browser
        header("Content-Type: image/png");
        echo $imagick->getImageBlob();
    }
    ?>
    
    This function requires at least 3 points. The following code fails when there are only two points left in the array:
    <?php
    $im = new Imagick ();
    $points = array (array ('x' => 10, 'y' => 10), array ('x' => 20, 'y' => 10), array ('x' => 30, 'y' => 40), array ('x' => 40, 'y' => 20), array ('x' => 50, 'y' => 60));
    $n = 0;
    while (!empty ($points))
    {
      $im->newImage (64, 64, "white");
      $draw = new ImagickDraw ();
      $draw->setFillColor ("none");
      $draw->setStrokeWidth (4);
      $draw->setStrokeColor ("black");
      $draw->setStrokeOpacity (0.9);
      $draw->setStrokeAntiAlias (true);
      $draw->bezier ($points);
      $im->drawImage ($draw);
      $im->writeImage ("IMG_$n.png");
      $draw->destroy ();
      $im->destroy ();
      echo count ($points) . ", $n: <img src=\"IMG_$n.png\"><br>";
      $n++;
      array_shift ($points);
    }
    ?>
    
    How to use:
    <?php
      $width = 200;
      $height = 200;
      $border = 2;
      
      $img = new Imagick();
      $img->newImage( $width, $height, new ImagickPixel( 'transparent' ) );
      
      $draw = new ImagickDraw();
      $draw->setStrokeColor( new ImagickPixel( 'black' ) );
      $draw->setStrokeWidth( 2 );
      $draw->setFillColor( new ImagickPixel( 'transparent' ) );
      // will fail in an obscure manner if the input data is invalid
      $points = array
      ( 
        array( 'x' => 0, 'y' => 200 ), 
        array( 'x' => 0, 'y' => 0 ), 
        array( 'x' => 200, 'y' => 200 ), 
        array( 'x' => 200, 'y' => 0 )
      );
      
      $draw->bezier($points);
          
      $img->drawImage( $draw );
      $img->setImageFormat( "png" );
      
      header( "Content-Type: image/png" );
      echo $img;
    ?>