Imagick::paintTransparentImage

(PECL imagick 2, PECL imagick 3)

Imagick::paintTransparentImageИзменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой

Внимание

Функция объявлена УСТАРЕВШЕЙ в Imagick 3.4.4. Полагаться на эту функцию крайне не рекомендуется.

Описание

public function Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

Изменяет любой пиксель, соответствующий цвету, на цвет, определённый заливкой.

Список параметров

target

Целевой цвет, заменяемый на указанное значение непрозрачности в изображении.

alpha

Уровень прозрачности: 1.0 - полностью непрозрачный, 0.0 - полностью прозрачный.

fuzz

Определяет, насколько допустимо считать два цвета одинаковыми.

Возвращаемые значения

При успешном выполнении функция возвращает true.

Ошибки

При ошибке функция выбрасывает исключение ImagickException.

Список изменений

Версия Описание
PECL imagick 2.1.0 Теперь разрешает использовать строку, представляющую цвет, в качестве первого параметра. Предыдущие версии допускали только объект ImagickPixel.

Добавить

Примечания пользователей 3 notes

up
2
Anonymous
17 years ago
Actually it does seem to work just not the way expected perhaps.

Looking at the fuzz option on ImageMagick's site (http://www.imagemagick.org/script/command-line-options.php#fuzz), "The distance can be in absolute intensity units or, by appending % as a percentage of the maximum possible intensity (255, 65535, or 4294967295)."

As it requires a float, the percentage value won't work so it actually one of the max intensity values.  In my case, the images I was working with seemed to have max intensity values of 65535.  So a fuzz of 6500, for roughly 10%, seemed to do the trick.

The part that might be problematic though is how do you determine the max intensity of a color/image?  Using a static 6500 would be fine until I would have to convert an image with a max intensity other than 65535.  If it's 255 it would wipe the entire image.  Or fall far short on the fuzz with the larger value.
up
0
quickshiftin at gmail dot com
11 years ago
Have a look at this thread on Stackoverflow for the answer regarding how to determine the max intensity of an image.

http://stackoverflow.com/questions/26239130/determine-max-possible-intensity-of-image/26240656#26240656

In short here is the code to make the $fuzz parameter behave more like you would expect (it now represents a percentage between 0-100). The $fuzz value should now be a float between 0 and 1.

class SaneImagick extends Imagick
{
    public function paintTransparentImage($target, $alpha, $fuzz)
    {
        $iQuantumDepth = pow(2, $this->getQuantumDepth()['quantumDepthLong']);
        return parent::paintTransparentImage($target, $alpha, $fuzz * $iQuantumDepth);
    }
}
up
0
alain at ocarina dot fr
14 years ago
The fuzz is just working well in a range of 0 to 65535.

I suggest you to try to move fuzz on a color spectrum image.

1/ Get a color spectrum ( Google Image has a lot )

2/ Try this code :

<?php

    function fuzzTest($source, $target, $fuzz) {

        // Loads image
        $im = new Imagick($source);

        // Resizes images to make them easily comparable
        $im->resizeImage(320, 240, Imagick::FILTER_LANCZOS, 1, true);
        
        // Apply fuzz
        $im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz);
        
         // Writes image
        $im->setImageFormat('png');
        $im->writeImage($target);
        $im->destroy();
         
        return true;
     }

     for ($i = 0; ($i <= 10); $i++) {
         fuzzTest('spectrum.png', "test_{$i}.png", (6553.5 * $i));
         echo '<img src="test_' . $i . '.png" />&nbsp;';
     }
 
 ?>
To Top