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();
?>Imagick::colorizeImage
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Imagick::colorizeImage
Референца за `imagick.colorizeimage.php` со подобрена типографија и навигација.
Imagick::colorizeImage
(PECL imagick 2, PECL imagick 3)
Imagick::colorizeImage — Blends the fill color with the image
= NULL
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.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успешен исход.
Errors/Exceptions
Фрла ImagickException при грешка.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 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. |
Примери
Пример #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();
}
?>Белешки од корисници 6 белешки
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);
}
}
?>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);
}
?>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;
?>