文字

Imagick::paintTransparentImage

(PECL imagick 2.0.0)

Imagick::paintTransparentImageChanges any pixel that matches color with the color defined by fill

说明

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

Changes any pixel that matches color with the color defined by fill.

参数

target

Change this target color to specified opacity value within the image.

alpha

The level of transparency: 1.0 is fully opaque and 0.0 is fully transparent.

fuzz

The fuzz member of image defines how much tolerance is acceptable to consider two colors as the same.

返回值

成功时返回 TRUE

错误/异常

错误时抛出 ImagickException。

更新日志

版本 说明
2.1.0 Now allows a string representing the color as the first parameter. Previous versions allow only an ImagickPixel object.

用户评论:

[#1] quickshiftin at gmail dot com [2014-10-07 16:22:41]

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

[#2] alain at ocarina dot fr [2011-10-17 14:14:48]

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(320240Imagick::FILTER_LANCZOS1true);
        
        
// Apply fuzz
        
$im->paintTransparentImage($im->getImagePixelColor(00), 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;';
     }
 
 
?>

[#3] Anonymous [2009-03-06 08:11:59]

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.

上一篇: 下一篇: