PNG with indexed colors and tranparency

Przemysław Sobala <[email protected]> Fri, 28 Jun 2019 11:27:24 +0200
Newsgroups gmane.comp.video.graphicsmagick.help
Message-ID <[email protected]>
Hello

I want to resize a PNG image maintaining the indexed palette of colors. 
I've tried:

$ gm convert -debug coders europe.png -colors 256 test.png
11:17:24 0:0.000751  0.000u 23390 constitute.c/ReadImage/1601/Coder:
   Invoking "PNG" decoder (Portable Network Graphics) subimage=0 subrange=0
11:17:24 0:0.000964  0.000u 23390 png.c/ReadPNGImage/2924/Coder:
   enter ReadPNGImage()
11:17:24 0:0.001218  0.000u 23390 png.c/ReadOnePNGImage/1543/Coder:
     enter ReadOnePNGImage()
11:17:24 0:0.001288  0.000u 23390 png.c/ReadOnePNGImage/1642/Coder:
       PNG width limit: 536870911, height limit: 536870911
11:17:24 0:0.001318  0.000u 23390 png.c/ReadOnePNGImage/1646/Coder:
       PNG pixels limit: 18446744073709551615
11:17:24 0:0.001375  0.000u 23390 png.c/ReadOnePNGImage/1767/Coder:
       PNG width: 570, height: 530
11:17:24 0:0.001405  0.000u 23390 png.c/ReadOnePNGImage/1771/Coder:
       PNG color_type: 3, bit_depth: 8
11:17:24 0:0.001443  0.000u 23390 png.c/ReadOnePNGImage/1774/Coder:
       PNG compression_method: 0
11:17:24 0:0.001490  0.000u 23390 png.c/ReadOnePNGImage/1777/Coder:
       PNG interlace_method: 0, filter_method: 0
11:17:24 0:0.001531  0.000u 23390 png.c/ReadOnePNGImage/2106/Coder:
       Reading PNG tRNS chunk.
11:17:24 0:0.001587  0.000u 23390 png.c/ReadOnePNGImage/2208/Coder:
       Reading PNG PLTE chunk: number_colors: 158.
11:17:24 0:0.001632  0.000u 23390 png.c/ReadOnePNGImage/2284/Coder:
       Reading PNG IDAT chunk(s)
11:17:24 0:0.001683  0.000u 23390 png.c/ReadOnePNGImage/2307/Coder:
       Converting PNG pixels to pixel packets
11:17:24 0:0.001737  0.000u 23390 png.c/ReadOnePNGImage/2512/Coder:
         Allocated quantum_scanline
11:17:24 0:0.003205  0.000u 23390 png.c/ReadOnePNGImage/2642/Coder:
         Free'ed quantum_scanline after last pass
11:17:24 0:0.004704  0.000u 23390 png.c/ReadOnePNGImage/2889/Coder:
     exit ReadOnePNGImage()
11:17:24 0:0.004789  0.010u 23390 png.c/ReadPNGImage/3001/Coder:
   exit ReadPNGImage()
11:17:24 0:0.004847  0.010u 23390 constitute.c/ReadImage/1613/Coder:
   Returned from "PNG" decoder: frames=1 cache=present monochrome=False 
grayscale=False class=DirectClass colorspace=RGB
11:17:24 0:0.047692  0.160u 23390 constitute.c/WriteImage/2231/Coder:
   Invoking "PNG" encoder (Portable Network Graphics): cache=present 
adjoin=True type=Undefined monochrome=False grayscale=False 
class=PseudoClass colorspace=RGB
11:17:24 0:0.047746  0.160u 23390 png.c/WritePNGImage/8664/Coder:
   enter WritePNGImage()
11:17:24 0:0.048000  0.160u 23390 png.c/WriteOnePNGImage/6890/Coder:
     enter WriteOnePNGImage()
11:17:24 0:0.048051  0.160u 23390 png.c/WriteOnePNGImage/6910/Coder:
       GM version     = 1.3.32
11:17:24 0:0.048087  0.160u 23390 png.c/WriteOnePNGImage/6912/Coder:
       Libpng version = 1.6.37
11:17:24 0:0.048123  0.160u 23390 png.c/WriteOnePNGImage/6919/Coder:
       Zlib version   = 1.2.11
11:17:24 0:0.048159  0.160u 23390 png.c/WriteOnePNGImage/6927/Coder:
       LCMS version   = 2090
11:17:24 0:0.048199  0.160u 23390 png.c/WriteOnePNGImage/7025/Coder:
     Image Characteristics:
     CMYK:       0
     Grayscale:  0
     Monochrome: 0
     Opaque:     0
     Palette:    1
11:17:24 0:0.048240  0.160u 23390 png.c/WriteOnePNGImage/7090/Coder:
       width=570
11:17:24 0:0.048275  0.160u 23390 png.c/WriteOnePNGImage/7093/Coder:
       height=530
11:17:24 0:0.048310  0.160u 23390 png.c/WriteOnePNGImage/7096/Coder:
       image->depth=8
11:17:24 0:0.048346  0.160u 23390 png.c/WriteOnePNGImage/7098/Coder:
     image_colors=83
11:17:24 0:0.048382  0.160u 23390 png.c/WriteOnePNGImage/7109/Coder:
       ping_bit_depth=8
11:17:24 0:0.048419  0.160u 23390 png.c/WriteOnePNGImage/7301/Coder:
       Tentative PNG color type: Palette (3)
11:17:24 0:0.048456  0.160u 23390 png.c/WriteOnePNGImage/7305/Coder:
       image_info->type: 0
11:17:24 0:0.048492  0.160u 23390 png.c/WriteOnePNGImage/7307/Coder:
       image->depth: 8
11:17:24 0:0.048529  0.160u 23390 png.c/WriteOnePNGImage/7309/Coder:
       ping_bit_depth: 8
11:17:24 0:0.048565  0.160u 23390 png.c/WriteOnePNGImage/7380/Coder:
     Found transparent color: (0,0,0)
11:17:24 0:0.048602  0.160u 23390 png.c/WriteOnePNGImage/7392/Coder:
     Determine if there is exactly one transparent color
11:17:24 0:0.048649  0.160u 23390 png.c/WriteOnePNGImage/7520/Coder:
     Setting up PLTE chunk with 83 colors
11:17:24 0:0.048689  0.160u 23390 png.c/WriteOnePNGImage/7541/Coder:
     Look for transparent colormap entry, number_colors=83
11:17:24 0:0.048724  0.160u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=0 is transparent
11:17:24 0:0.048770  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=14 is transparent
11:17:24 0:0.048807  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=34 is transparent
11:17:24 0:0.048844  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=37 is transparent
11:17:24 0:0.048880  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=16 is transparent
11:17:24 0:0.048918  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=56 is transparent
11:17:24 0:0.048954  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=44 is transparent
11:17:24 0:0.048991  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=2 is transparent
11:17:24 0:0.049028  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=22 is transparent
11:17:24 0:0.049064  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=18 is transparent
11:17:24 0:0.049100  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=1 is transparent
11:17:24 0:0.049137  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=68 is transparent
11:17:24 0:0.049173  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=47 is transparent
11:17:24 0:0.049211  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=59 is transparent
11:17:24 0:0.049246  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=29 is transparent
11:17:24 0:0.049283  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=58 is transparent
11:17:24 0:0.049318  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=48 is transparent
11:17:24 0:0.049354  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=49 is transparent
11:17:24 0:0.049390  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=5 is transparent
11:17:24 0:0.049426  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=65 is transparent
11:17:24 0:0.049460  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=11 is transparent
11:17:24 0:0.049496  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=7 is transparent
11:17:24 0:0.049532  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=73 is transparent
11:17:24 0:0.049567  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=64 is transparent
11:17:24 0:0.049602  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=41 is transparent
11:17:24 0:0.049638  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=71 is transparent
11:17:24 0:0.049675  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=6 is transparent
11:17:24 0:0.049712  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=70 is transparent
11:17:24 0:0.049747  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=63 is transparent
11:17:24 0:0.049791  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=43 is transparent
11:17:24 0:0.049833  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=10 is transparent
11:17:24 0:0.049870  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=28 is transparent
11:17:24 0:0.049910  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=31 is transparent
11:17:24 0:0.049957  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=38 is transparent
11:17:24 0:0.049994  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=72 is transparent
11:17:24 0:0.050031  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=42 is transparent
11:17:24 0:0.050076  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=33 is transparent
11:17:24 0:0.050120  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=24 is transparent
11:17:24 0:0.050163  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=20 is transparent
11:17:24 0:0.050207  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=69 is transparent
11:17:24 0:0.050246  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=36 is transparent
11:17:24 0:0.050344  0.170u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=13 is transparent
11:17:24 0:0.050392  0.180u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=74 is transparent
11:17:24 0:0.050486  0.180u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=54 is transparent
11:17:24 0:0.050526  0.180u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=67 is transparent
11:17:24 0:0.050618  0.180u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=62 is transparent
11:17:24 0:0.050706  0.180u 23390 png.c/WriteOnePNGImage/7570/Coder:
     Index=52 is transparent
11:17:24 0:0.050777  0.180u 23390 png.c/WriteOnePNGImage/7581/Coder:
     num_alpha = 47
11:17:24 0:0.051812  0.190u 23390 png.c/WriteOnePNGImage/7598/Coder:
       Cannot write image as indexed PNG, writing RGBA.
11:17:24 0:0.051850  0.190u 23390 png.c/WriteOnePNGImage/7684/Coder:
       PNG color type: RGB+Alpha (6)
11:17:24 0:0.051885  0.190u 23390 png.c/WriteOnePNGImage/7692/Coder:
     Setting up deflate compression
11:17:24 0:0.051920  0.190u 23390 png.c/WriteOnePNGImage/7695/Coder:
       Compression buffer size: 32768
11:17:24 0:0.051955  0.190u 23390 png.c/WriteOnePNGImage/7699/Coder:
       Compression mem level: 9
11:17:24 0:0.051992  0.190u 23390 png.c/WriteOnePNGImage/7709/Coder:
       Compression level: 7
11:17:24 0:0.052027  0.190u 23390 png.c/WriteOnePNGImage/7722/Coder:
     Setting up filtering
11:17:24 0:0.052064  0.190u 23390 png.c/WriteOnePNGImage/7736/Coder:
       Filter_type: 0
11:17:24 0:0.052100  0.190u 23390 png.c/WriteOnePNGImage/7758/Coder:
       Base filter method: ADAPTIVE
11:17:24 0:0.052154  0.190u 23390 png.c/WriteOnePNGImage/7773/Coder:
     Writing PNG header chunks
11:17:24 0:0.052206  0.190u 23390 png.c/WriteOnePNGImage/7801/Coder:
     Setting up bKGD chunk
11:17:24 0:0.052251  0.190u 23390 png.c/WriteOnePNGImage/8104/Coder:
     mng_info: columns=570, image_depth=8, write_png8=0, write_png24=0, 
write_png32=0 write_png48=0, write_png64=0, IsPalette=0, image_matte=1
11:17:24 0:0.052287  0.190u 23390 png.c/WriteOnePNGImage/8146/Coder:
     Allocating 2280 bytes of memory for pixels
11:17:24 0:0.052322  0.190u 23390 png.c/WriteOnePNGImage/8264/Coder:
     pass 0, Image Is RGB, PNG colortype is RGB+Alpha (6)
11:17:24 0:0.074259  0.300u 23390 png.c/WriteOnePNGImage/8322/Coder:
     pass 0 done
11:17:24 0:0.074287  0.300u 23390 png.c/WriteOnePNGImage/8376/Coder:
     Writing PNG image data
11:17:24 0:0.074316  0.300u 23390 png.c/WriteOnePNGImage/8378/Coder:
       Width: 570
11:17:24 0:0.074344  0.300u 23390 png.c/WriteOnePNGImage/8381/Coder:
       Height: 530
11:17:24 0:0.074374  0.300u 23390 png.c/WriteOnePNGImage/8384/Coder:
       PNG sample depth: 8
11:17:24 0:0.074403  0.300u 23390 png.c/WriteOnePNGImage/8386/Coder:
       PNG color type: RGB+Alpha (6)
11:17:24 0:0.074440  0.300u 23390 png.c/WriteOnePNGImage/8390/Coder:
       PNG Interlace method: 0
11:17:24 0:0.074477  0.300u 23390 png.c/WriteOnePNGImage/8490/Coder:
     Writing PNG end info
11:17:24 0:0.074518  0.300u 23390 png.c/WriteOnePNGImage/8553/Coder:
     exit WriteOnePNGImage()
11:17:24 0:0.074566  0.300u 23390 png.c/WritePNGImage/8750/Coder:
   exit WritePNGImage()
11:17:24 0:0.074607  0.300u 23390 constitute.c/WriteImage/2246/Coder:
   Returned from "PNG" encoder, Succeeded

And it turns out that GraphicsMagick can't do that because of Cannot 
write image as indexed PNG, writing RGBA message.
Look for transparent colormap entry reveals num_alpha = 47and in 
coders/png.c there's an if

                       if (num_alpha == 1)

                       else
                       {
ping_colortype=PNG_COLOR_TYPE_RGB_ALPHA;

I tried some other PNG images with transparency and they all have 
num_alpha>1.

Does that mean that GraphicsMagick can't handle creating palette PNG 
images with transparency? How can I obviate that? Is reducing number of 
transparent colors in palette to 1 the best solution?

--
Best regards
Przemysław Sobala

_______________________________________________
Graphicsmagick-help mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/graphicsmagick-help
europe.png (image/png, 23 KB) - not displayed