#40158 [Opn->Fbk]: Artifact left on transparent pngs using image filters
| From: | pajoye@php.net | Date: | Thu, 18 Jan 2007 18:51:04 +0000 |
| Subject: | #40158 [Opn->Fbk]: Artifact left on transparent pngs using image filters | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-107736@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: Open
+Status: Feedback
Bug Type: GD related
Operating System: Windows XP
PHP Version: 5.2.0
Assigned To: pajoye
New Comment:
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.
Previous Comments:
------------------------------------------------------------------------
[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 )
------------------------------------------------------------------------
[2007-01-18 15:22:49] pajoye@php.net
Can you provide an image to show what you expect?
I did not check your script but having an image will help to really
understand what you are trying to achieve.
By the way, filters work only with truecolor images, allocate will
never fail.
------------------------------------------------------------------------
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