#39273 [Bgs->Opn]: imagecopyresized() not compatable with alpha channel

From: Date: Fri, 27 Oct 2006 17:22:08 +0000
Subject: #39273 [Bgs->Opn]: imagecopyresized() not compatable with alpha channel
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-104077@lists.php.net to get a copy of this message
ID: 39273 User updated by: seth at pricepages dot org Reported By: seth at pricepages dot org -Status: Bogus +Status: Open Bug Type: GD related Operating System: Mac 10.4 PHP Version: 5.1.6 Assigned To: pajoye New Comment: 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. Previous Comments: ------------------------------------------------------------------------ [2006-10-27 14:01:12] pajoye@php.net 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] tony2001@php.net 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

« previous php.bugs (#104077) next »