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

    (PECL imagick 2.0.0)

    Blends the fill color with the image

    说明

    Imagick::colorizeImage(mixed $colorize, mixed $opacity[,bool $legacy= FALSE]): bool

    Blends the fill color with each pixel in the image.

    参数

    $colorize

    ImagickPixel object or a string containing the colorize color

    $opacity

    ImagickPixel object or an float containing the opacity value. 1.0 is fully opaque and 0.0 is fully transparent.

    返回值

    成功时返回TRUE

    错误/异常

    错误时抛出 ImagickException。

    更新日志

    版本说明
    2.1.0 Now allows a string representing the color as the first parameter and a float representing the opacity value as the second parameter. Previous versions allow only an ImagickPixel objects.

    范例

    Example #1 Imagick::colorizeImage()

    <?php
    function colorizeImage($imagePath, $color, $opacity) {
        $imagick = new \Imagick(realpath($imagePath));
        $opacity = $opacity / 255.0;
        $opacityColor = new \ImagickPixel("rgba(0, 0, 0, $opacity)");
        $imagick->colorizeImage($color, $opacityColor);
        header("Content-Type: image/jpg");
        echo $imagick->getImageBlob();
    }
    ?>
    
    If you're looking for a solution to fill the image with a solid color, preserving background transparency, here is one way:
    <?php
    $im = new Imagick('image.png');
    $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
    $im->setImageBackgroundColor('color');
    $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_SHAPE);
    $im->writeImage('output.png');
    $im->destroy();
    ?>
    
    Do you want a color overlay with TRUE opacity control? Try this:
    <?php
    class YourImagick extends Imagick
    {
      public function colorize($color, $alpha = 1)
      {
        $draw = new ImagickDraw();
        $draw->setFillColor($color);
        if (is_float($alpha)) {
          $draw->setFillAlpha($alpha);
        }
        $geometry = $this->getImageGeometry();
        $width = $geometry['width'];
        $height = $geometry['height'];
        $draw->rectangle(0, 0, $width, $height);
        $this->drawImage($draw);
      }
    }
    ?>
    How to use:
    <?php
    $imagick = new YourImagick('example.png');
    $imagick->colorize('#ffcc00', 0.35);
    header('Content-type: image/png');
    echo $source;
    ?>
    
    To improve upon "php at lfbittencourt dot com"'s solution, this one blends the composited color, and takes opacity into account as well.
    <?php
    class YourImagick extends Imagick
    {
      public function colorize($color, $alpha = 1, $composite_flag = Imagick::COMPOSITE_COLORIZE)
      {
        $draw = new ImagickDraw();
        $draw->setFillColor($color);
        $geometry = $this->getImageGeometry();
        $width = $geometry['width'];
        $height = $geometry['height'];
        $draw->rectangle(0, 0, $width, $height);
        $temporary = new Imagick();
        $temporary->setBackgroundColor(new ImagickPixel('transparent'));
        $temporary->newImage($width, $height, new ImagickPixel('transparent'));
        $temporary->setImageFormat('png32');
        $temporary->drawImage($draw);
        $alphaChannel = $this->clone();
        $alphaChannel->setImageAlphaChannel(Imagick::ALPHACHANNEL_EXTRACT);
        $alphaChannel->negateImage(false, Imagick::CHANNEL_ALL);
        $this->setImageClipMask($alphaChannel);
        $clone = $this->clone();
        $clone->compositeImage($temporary, $composite_flag, 0, 0);
        $clone->setImageOpacity($alpha);
        $this->compositeImage($clone, Imagick::COMPOSITE_DEFAULT, 0, 0);
      }
    }
    ?>
    
    When you're using an image with an alpha channel (for example a transparent png), a value of 1.0 will return a completely transparent image, but a value of 1 works just fine.
    simplest example
    <?php
    $nombre = '001-4-0043.jpg';
    $img = new Imagick($nombre);
    $img->negateImage(false);
    //$pixblu = new ImagickPixel('#000040');
    $img->colorizeImage('#0000b0',1.0);
    header('content-type: image/jpeg');
    echo $img;
    ?>