Imagick::colorizeImage

(PECL imagick 2, PECL imagick 3)

Imagick::colorizeImageBlends the fill color with the image

Descrizione

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

Blends the fill color with each pixel in the image.

Elenco dei parametri

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.

Valori restituiti

Restituisce true in caso di successo.

Errori/Eccezioni

Lancia una ImagickException in caso di errore.

Log delle modifiche

Versione Descrizione
PECL imagick 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.

Esempi

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

?>

add a note add a note

User Contributed Notes 6 notes

up
8
Alex Lokhman [VisioN]
10 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
10 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.

<?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);
    }
}
?>
up
7
php at lfbittencourt dot com
12 years ago
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;

?>
up
1
adrien at unik dot solutions
1 year 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 :

<?php
public 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
12 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
15 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