#39353 [Bgs]: more imagecopyresized() alpha problems

From: Date: Sat, 04 Nov 2006 00:28:54 +0000
Subject: #39353 [Bgs]: more imagecopyresized() alpha problems
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-104360@lists.php.net to get a copy of this message
ID: 39353 User updated by: seth at pricepages dot org Reported By: seth at pricepages dot org Status: Bogus Bug Type: GD related Operating System: Mac 10.4 PHP Version: 5CVS-2006-11-02 (snap) Assigned To: pajoye New Comment: Well, you can tell me what I'm doing wrong then. I have a source image with fully transparent pixels. I would like to copy it over another image, so the final image has fully transparent pixels. To do this, I set imagealphablending() to false, and I copy via imagecopyresized(). But no fully transparent pixels are copied. Your statement does not address the second bug that I mentioned. Previous Comments: ------------------------------------------------------------------------ [2006-11-04 00:17:25] pajoye@php.net "But if the alpha blending is set to false, you want to copy the transparent pixels." No, you do not want. Alpha channel and transparent color are two different things. Alpha blending works with the alpha channel not with the transparent color. I closed this bug (bogus), reopen it if you think that I misunderstood your problem. ------------------------------------------------------------------------ [2006-11-03 00:23:48] seth at pricepages dot org Description: ------------ I'm not sure how many bugs are hidden here, but I thought this should be submitted. imagecopyresized() is ignoring alpha the blending mode. Specifically, in ext/gd/libgd/gd.c line 2376 or so, there is this code that skips processing transparent pixels: tmp = gdImageGetPixel (src, x, y); if (gdImageGetTransparent (src) == tmp) { tox += stx[x - srcX]; continue; } But if the alpha blending is set to false, you want to copy the transparent pixels. So commenting out this if statement removes one bug. There is other similar code in this loop, so maybe it should all be removed? Unfortunately, all result pixels still opaque, when the source image pixels are partially transparent. So this code does not fix the problem. Reproduce code: --------------- <?php $small = imagecreatefrompng( 'http://pricepages.org/temp/partialTrans.png'); $width = 300; $height = 300; $srcW = imagesx($small); $srcH = imagesy($small); $img = imagecreatetruecolor($width, $height); $red = imagecolorresolve($img,255,0,0); imagefill($img, 0,0, $red); imagealphablending($img, false); imagecopyresized($img, $small, 0,0, 0,0, $width, $height, $srcW, $srcH); header('Content-Type: image/png'); imagepng($img); ?> Expected result: ---------------- The image is filled with red, and a partially transparent black-and-white image is composited on top of it. Because alpha blending is set to false, there should be no red showing in the final image. (bug#1, squashed above) Also, because the greyscale image should have partial transparency, there should be a gradient between black and red, but there is none. It is only black or only red. (bug#2) ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=39353&edit=1

« previous php.bugs (#104360) next »