#39273 [Bgs]: imagecopyresized() not compatable with alpha channel
| From: | pajoye@php.net | Date: | Sat, 28 Oct 2006 14:19:46 +0000 |
| Subject: | #39273 [Bgs]: imagecopyresized() not compatable with alpha channel | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-104112@lists.php.net to get a copy of this message | ||
ID: 39273
Updated by: pajoye@php.net
Reported By: seth at pricepages dot org
Status: Bogus
Bug Type: GD related
Operating System: Mac 10.4
PHP Version: 5.1.6
Assigned To: pajoye
New Comment:
Pardon? What is a boolean transparency?
Please understand these three things:
- The transparent color is one *color*, an index for palette based
image or 32bits value for truecolor images. It defines which color is
used as the *background* color (like white is the background color of
a white paper).
- The *alpha* channel of a pixel defines how translucide the pixel has
to be. It has nothing to do with the transparent color.
- Your image has *no* transparent color but many pixels with various
*alpha* levels.
Load the result images in your favourite paint programs to see what I
mean. The area outside the line is translucide, it is due to the alpha
channel.
Previous Comments:
------------------------------------------------------------------------
[2006-10-28 14:11:56] seth at pricepages dot org
But that has one of the bugs that I pointed out: boolean
transparency. The original doesn't have that problem.
------------------------------------------------------------------------
[2006-10-28 14:04:59] pajoye@php.net
Use the code I just gave you, it does create the resized version (by
copying):
http://blog.thepimp.net/misc/39273_out.png
------------------------------------------------------------------------
[2006-10-28 13:15:45] seth at pricepages dot org
I ran your code before I posted my last comment, but I still
don't know what you are implying. The results are exactly as I
expect them to be.
If this bug is bogus, please tell me how I can create an
enlarged version of test.png? It isn't possible without
applying a fix.
------------------------------------------------------------------------
[2006-10-28 10:49:54] pajoye@php.net
"I am aware that the image is fully black, except for
variations in alpha. That is why this is a bug related to
the alpha channel and not any other."
You are not aware that your image is *NOT* fully black.
Background color (the transparent color) is not the same than a color
with a ALPHA component. Please run the code I gave you, read the
results (like the values of the channels in these two pixels, or any
other).
------------------------------------------------------------------------
[2006-10-27 17:22:07] seth at pricepages dot org
I am aware that the image is fully black, except for
variations in alpha. That is why this is a bug related to
the alpha channel and not any other.
Well, I went in and fixed it myself. The problem was in the
function gdImageGetTrueColorPixel(). It assumed that palette
images always have binary transparency, with a correct value
in im->transparent. Because my source image didn't have a
correct value in im->transparent, it was always marked as
opaque.
This line:
return gdTrueColorAlpha(im->red[p], im->green[p], im->blue
[p], (im->transparent == p) ? gdAlphaTransparent :
gdAlphaOpaque);
Needs to be changed to:
return gdTrueColorAlpha(im->red[p], im->green[p], im->blue
[p], (im->transparent == p) ? gdAlphaTransparent : im->alpha
[p]);
Making this patch also fixes the same bug in
imagecopyresampled(), and who knows what else.
Although, I would recommend using gdTrueColorAlpha() at the
appropriate point(s) in gdImageCopyResized() instead of
gdImageGetTrueColorPixel(). This would eliminate an extra
function call, branch, and color lookup.
------------------------------------------------------------------------
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/39273
--
Edit this bug report at http://bugs.php.net/?id=39273&edit=1