Imagick::colorizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::colorizeImage塗りつぶし色と画像を混合する

説明

public Imagick::colorizeImage(mixed $colorize, mixed $opacity, bool $legacy = false): bool

画像の各ピクセルに、塗りつぶし色を混合します。

パラメータ

colorize

色を表す ImagickPixel オブジェクトあるいは文字列。

opacity

不透明度を表す ImagickPixel オブジェクトあるいは文字列。 1.0 は完全に不透明、0.0 は完全に透明であることを表します。

戻り値

成功した場合に true を返します。

エラー / 例外

エラー時に ImagickException をスローします。

変更履歴

バージョン 説明
PECL imagick 2.1.0 色を表す文字列を最初のパラメータとして、 不透明度を表す浮動小数点数値を 2 番目のパラメータとして指定できるようになりました。 これまでのバージョンでは ImagickPixel オブジェクトしか指定できませんでした。

例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();
}

?>

add a note

User Contributed Notes 6 notes

up
8
Alex Lokhman [VisioN]
11 years ago
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();?>
up
3
olav at redwall dot ee
11 years ago
To improve upon "php at lfbittencourt dot com"'s solution, this one blends the composited color, and takes opacity into account as well.<?phpclass 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);    }}?>
up
7
php at lfbittencourt dot com
13 years ago
Do you want a color overlay with TRUE opacity control? Try this:<?phpclass 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;?>
up
1
adrien at unik dot solutions
2 years ago
The solution published by "olav at redwall dot ee " was adding a black surround outside each non-transparent shape.Here is my improved version :<?phppublic function colorize($color, $alpha = 1){    $geometry = $this->getImageGeometry();    $width = $geometry['width'];    $height = $geometry['height'];            $draw = new ImagickDraw;    $draw->setFillColor($color);    $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);    $temporary->compositeImage($this, Imagick::COMPOSITE_COPYOPACITY, 0, 0);            $this->setImageArtifact('compose:args', ($alpha * 100) . '%,100%');    $this->compositeImage($temporary, Imagick::COMPOSITE_DISSOLVE, 0, 0);}?>
up
0
talkol at gmail dot com
13 years ago
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.
up
-1
lsmartinez at gmail dot com
16 years ago
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;?>
To Top