Imagick::paintTransparentImage()
(PECL imagick 2.0.0)
Changes any pixel that matches color with the color defined by fill
说明
Imagick::paintTransparentImage(mixed $target,float $alpha,float $fuzz): bool
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. |
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.
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); } }
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" /> '; } ?>