ID: 39273
Updated by: [EMAIL PROTECTED]
Reported By: seth at pricepages dot org
-Status: Open
+Status: Assigned
Bug Type: GD related
Operating System: Mac 10.4
PHP Version: 5.1.6
Assigned To: pajoye
Previous Comments:
------------------------------------------------------------------------
[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.
------------------------------------------------------------------------
[2006-10-27 14:01:12] [EMAIL PROTECTED]
There is nothing wrong in imagecopyresize (or imagecopy).
The problem you have is the misunderstanding of what is the background
color, the alpha channel and alpha blending.
Your original image has many black colors, one is transparent (what you
consider as background), and the other with various transparency
levels.
Try the code below, it will explain you what is your image and how it
works.
<?php
$small = imagecreatefrompng('39273.png');
print_r(imagecolortransparent($small));
$width = 300;
$height = 300;
$srcW = imagesx($small);
$srcH = imagesy($small);
print_r(imagecolorsforindex($small, imagecolorat($small, 0,0)));
// one of the ""black"" pixel
print_r(imagecolorsforindex($small, imagecolorat($small, 37,1)));
imagecolortransparent($small, 1);
$img = imagecreatetruecolor($width, $height);
$trans = imagecolorresolve($img,255,255,255);
imagefill($img, 0,0, $trans);
imagecolortransparent($img, $trans);
imagecopyresized($img, $small, 0,0, 0,0, $width, $height, $srcW,
$srcH);
imagepng($img, '1.png');
------------------------------------------------------------------------
[2006-10-27 07:42:40] [EMAIL PROTECTED]
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5.2-win32-latest.zip
------------------------------------------------------------------------
[2006-10-27 04:17:23] seth at pricepages dot org
Description:
------------
imagecopyresampled() should be copying the alpha channel, but
it doesn't seem to be doing so. This is a palette based source
image being copied to a true color image.
If you use imagecopy() instead, the image copies as expected
(mostly).
Reproduce code:
---------------
<?php
$small = imagecreatefrompng('http://leopold.sage.wisc.edu/test.png');
$width = 300;
$height = 300;
$srcW = imagesx($small);
$srcH = imagesy($small);
$img = imagecreatetruecolor($width, $height);
//Make a transparent canvas
$trans = imagecolorresolve($img,255,255,255);
imagecolortransparent($img, $trans);
imagealphablending($img, false);
imagefilledrectangle( $img,
0, 0,
$width, $height,
$trans);
//This shouldn't *need* to be on, but it does
imagealphablending($img, true);
//One of these works, the other doesn't
//imagecopy($img, $small, 0,0, 0,0, $srcW, $srcH);
imagecopyresized($img, $small, 0,0, 0,0, $width, $height, $srcW,
$srcH);
header('Content-Type: image/png');
imagepng($img);
?>
Expected result:
----------------
An enlarged, pixellated, mostly transparent, image.
Actual result:
--------------
A black, opaque, image.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=39273&edit=1