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