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

    (PECL imagick 2.0.0)

    Clips along the named paths from the 8BIM profile

    说明

    Imagick::clipPathImage(string $pathname,bool $inside): bool

    Clips along the named paths from the 8BIM profile, if present. Later operations take effect inside the path. It may be a number if preceded with #, to work on a numbered path, e.g.,"#1" to use the first path.

    参数

    $pathname

    The name of the path

    $inside

    If TRUE later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path.

    返回值

    成功时返回TRUE

    错误/异常

    错误时抛出 ImagickException。

    I found Imagick::clipPathImage and Imagic::clipImage did not work as I had expected. I thought they would just clip the path and throw away the extra data and you are done. Not the case. 
    Here is how I was able to use a clipping path:
    <?php
       $img = new Imagick("/Path/To/Test/Image.psd");
       $geometry = $img->getImageGeometry();
       // Uses the first path as the clipping path
       $img->clipPathImage("#1", false);
       // Fill the clipped part with a color
       $draw = new ImagickDraw();
       $draw->setFillColor("#000000");
       $draw->color(0,0, imagick::PAINT_RESET);
       $img->drawImage($draw);
       // Composite the clipped image with the old image. Set the color of the composite to any color you want to be the outside part.
       $composite = new Imagick($path);
       $composite->newImage( $geometry['width'], $geometry['height'], new ImagickPixel("white"), 'png');
       $composite->compositeImage($img, imagick::COMPOSITE_COPY, 0, 0);
    ?>
    Then doing any resizing or creating thumbnails from the resulting image disregarded all the previous commands so I "saved" it and started with a new Imagick object
    <?php
       // Copy the image so clip is "saved"
       $clipped = new Imagick();
       $clipped->readImageBlob($composite->getImageBlob());
    ?>
    I'm sure there is a simpler way, but this took me awhile to get right and there were some hurdles to cross so I hope it is able to help someone on the way.
    This is all the convert equivalent of:
    $ convert Test.psd -fill white -colorspace rgb -draw "color 0 0 reset" -clip -colorspace rgb -draw "Image Copy 0,0 0,0 'Test.psd'" OutputFile.png