#40158 [Fbk]: Artifact left on transparent pngs using image filters
| From: | pajoye@php.net | Date: | Thu, 18 Jan 2007 18:51:59 +0000 |
| Subject: | #40158 [Fbk]: Artifact left on transparent pngs using image filters | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-107737@lists.php.net to get a copy of this message | ||
ID: 40158
Updated by: pajoye@php.net
Reported By: henus at mail dot ru
Status: Feedback
Bug Type: GD related
Operating System: Windows XP
PHP Version: 5.2.0
Assigned To: pajoye
New Comment:
(rgba(255,0,0,xxx)) should have been (rgba(0,0,255,xxx)) but you
noticed it :)
Previous Comments:
------------------------------------------------------------------------
[2007-01-18 18:51:04] pajoye@php.net
An absolute black image is not what you should expect.
imagefilter($mask, IMG_FILTER_COLORIZE, -255, -255, 0); will replace
the white color with blue (you remove all components but the blue):
http://blog.thepimp.net/misc/bug40158_filtered_mask.png
imagecopy($imagemain, $mask, 0, 0, 0, 0, $imagewidth, $imageheight);
will copy it over the $imagemain, the border of the quadrant will be
blended over black:
http://blog.thepimp.net/misc/bug40158_result.png
Each pixel in your circle are rgb(255,255,255) with some alpha value in
the edges (and only in the edges). You are substracting 255 to the R and
G component, the result is blue.
Now, take a look at this image:
http://blog.thepimp.net/misc/bug40158_correct_filtered_mask.png
It is what you are expecting (if I understand correctly your problem).
The edges of the circle have a blue color with various alpha values
(rgba(255,0,0,xxx)). You can reproduce it by disabling the alpha
blending mode in the mask image (imagealphablending($mask, false); ).
The alpha component will be kept and stored in the image instead of
being used as a blending value.
Let me know if that solves your problem.
By the way, COLORIZE uses gdImageColor. The lines you are referring to
are in the contrast function.
------------------------------------------------------------------------
[2007-01-18 18:32:16] henus at mail dot ru
i expect absolutely black image like
http://www.fort-ross.ru/henus/gd/result_correct.png
instead of
http://www.fort-ross.ru/henus/gd/result_incorrect.png
i use colorizing by black for clearness.
------------------------------------------------------------------------
[2007-01-18 18:11:31] henus at mail dot ru
correction fo my previous post about
php-5.2.0\ext\gd\libgd\gd.c
Lines 3682-3688:
new_pxl = gdImageColorAllocateAlpha(src, (int)r, (int)g, (int)b, a);
if (new_pxl == -1) {
new_pxl = gdImageColorClosestAlpha(src, (int)r, (int)g, (int)b, a);
}
if ((y >= 0) && (y < src->sy)) {
gdImageSetPixel (src, x, y, new_pxl);
in gdImageSetPixel src should be absolutely transparent, with
alpha=127
differently it mix colors.
------------------------------------------------------------------------
[2007-01-18 18:09:31] pajoye@php.net
Please provide an *image* showing what you expect.
------------------------------------------------------------------------
[2007-01-18 17:56:25] henus at mail dot ru
i create black image and overlay it by colorized
white-truecolor-png24-image ( http://fort-ross.ru/henus/gd/mask.png )
the result of colorize like:
imagefilter($mask, IMG_FILTER_COLORIZE, -255, -255, -255);
is image:
http://www.fort-ross.ru/henus/gd/result_incorrect.png
which contain artefacts...
also, the result of such script (
http://fort-ross.ru/henus/gd/demo2.phps )
is:
is truecolor - 1
before - Array ( [red] => 255 [green] => 255 [blue] => 255 [alpha] =>
63 )
wrong result, using filter - Array ( [red] => 126 [green] => 126 [blue]
=> 126 [alpha] => 31 )
wrong result, using imagecolorallocatealpha and imagesetpixel - Array (
[red] => 126 [green] => 126 [blue] => 126 [alpha] => 31 )
correct result, using imagefill, imagecolorallocatealpha and
imagesetpixel - Array ( [red] => 0 [green] => 0 [blue] => 0 [alpha] =>
63 )
I.e.
colorizing pixel ( [red] => 255 [green] => 255 [blue] => 255 [alpha] =>
63 ) to black
should be with ( [red] => 0 [green] => 0 [blue] => 0 [alpha] => 63 ),
not ( [red] => 126 [green] => 126 [blue] => 126 [alpha] => 31 )
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/40158
--
Edit this bug report at http://bugs.php.net/?id=40158&edit=1