Bug with png images in grayscale + alpha

[email protected] (Daniel Diaz)
Newsgroups php.gd.devel,php.gd.bugs
Message-ID <[email protected]>
Hi,


First, thanks a lot for this wonderful library.

There is a bug in gd_png.c when dealing with a png in grayscale + alpha 
(color_type == PNG_COLOR_TYPE_GRAY_ALPHA). Tested version is last CVS 
(gd_png.c v 1.23).

The existing does not make a difference between PNG_COLOR_TYPE_GRAY and 
PNG_COLOR_TYPE_GRAY_ALPHA. In the PNG_COLOR_TYPE_GRAY_ALPHA mode, 
row_pointers contain 2 bytes par pixel, (rowbytes = 2 *width) but 
existing code simply uses the first width bytes (forgetting the width 
next others). The result is a wrong image : only the left half is loaded 
in memory (but with wrong gray colors).

I attach an image.png file in this format. If you use:
   pngtogd image.png foo.gd
   gdtopng foo.gd new-image.png
you will see that new-mage1.png is wrong (see attached file).

A preliminar solution consists in adding the following code to 
gd_png.c:415 (just before the default:)

   case PNG_COLOR_TYPE_GRAY_ALPHA:
     for (h = 0; h < height; ++h) {
       int boffset = 0;
       for (w = 0; w < width; ++w) {
	register png_byte idx = row_pointers[h][boffset++];
	im->pixels[h][w] = idx;
	open[idx] = 0;
// add code to deal with alpha at row_pointer[h][boffset]
// for now we simply ignore it !
	boffset++;
       }
     }
     break;

Obviously I here simply ignore alpha bytes (I don't know how alpha 
channel is handled in libgd, sorry).

DD
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.