©
Dokumen ini menggunakan Manual laman web PHP Cina Lepaskan
(PECL imagick 2.0.0)
Imagick::colorizeImage — Blends the fill color with the image
$colorize
, mixed $opacity
)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 ();
}
?>
[#1] Alex Lokhman [VisioN] [2014-03-22 14:35:00]
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();
?>
[#2] olav at redwall dot ee [2013-12-18 12:24:15]
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);
}
}
?>
[#3] php at lfbittencourt dot com [2012-05-11 13:26:10]
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;
?>
[#4] talkol at gmail dot com [2011-12-28 07:19:28]
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.
[#5] lsmartinez at gmail dot com [2009-04-08 09:42:16]
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;
?>