ID:               39353
 Updated by:       [EMAIL PROTECTED]
 Reported By:      seth at pricepages dot org
-Status:           Bogus
+Status:           Feedback
 Bug Type:         GD related
 Operating System: Mac 10.4
 PHP Version:      5CVS-2006-11-02 (snap)
 Assigned To:      pajoye
 New Comment:

"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:"

My statement covers this part of your report, which is wrong. It is the
expected behavior to do not copy the transparent color.

The transparent color has nothing to do with the *alpha* channel of any
other pixels.

The alpha blending mode affects *only* pixels with alpha channels, not
the transparent color.

Which second bug are you talking about? The link bug#1 and bug#2 does
not work, maybe you are refering to them?

As a sidenote, it makes no sense to call colorresolve for truecolor
images, just use imagecolorallocate or imagecolorallocatealpha.

Here is your example, with a check for truecolor or indexed image, and
showing which color is the *transparent* color
(imagecolortransparent):
$small = imagecreatefrompng('bug39353.png');
if (imageistruecolor($small)) {
    echo "truecolor image\n"; 
} else {
    $c = imagecolortransparent($small);
    echo "transparent index: " . $c . "\n";
    print_r( imagecolorsforindex($small,$c));
}

$width = 300;
$height = 300;
$srcW = imagesx($small);
$srcH = imagesy($small);

$img = imagecreatetruecolor($width, $height);
$red = imagecolorallocate($img,255,0,0);
imagefill($img, 0,0, $red);
imagecopyresized($img, $small, 0,0, 0,0, $width, $height,
$srcW,$srcH);
imagepng($img, 'a.png');
?>
and the result image:
http://blog.thepimp.net/misc/bug39353_out.png

Please note that the transparent color is the index 0 and has these
values:
transparent index: 0
Array
(
    [red] => 246
    [green] => 246
    [blue] => 246
    [alpha] => 127
)

Is it more clear now?




Previous Comments:
------------------------------------------------------------------------

[2006-11-04 00:28:54] seth at pricepages dot org

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.

------------------------------------------------------------------------

[2006-11-04 00:17:25] [EMAIL PROTECTED]

"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

Reply via email to