[gdal-dev] Troubleshooting palette management. Potential bug in palette for overviews?
Even Rouault
even.rouault at spatialys.com
Thu Nov 24 04:35:50 PST 2016
Daniele,
This is indeed an inconsistency I spotted a long time ago :
https://trac.osgeo.org/gdal/ticket/2213
Nobody was apparently sufficiently annoyed by this to fix it. Actually I see I proposed a patch.
Was probably waiting for feedback. I'm not sure if there's a standardized way of converting
between the [0,255] and [0,65535] ranges.
Even
> Hi List,
> I'm investigating on a issue I have with a paletted image with overviews,
> using java ImageIO tiff reader (wait... I know on this list we discuss
> about GDAL topics :) ).
> I'm trying to better understand palette interpretation and palette storing
> on tags and how they are handled by GDAL.
>
> From TIFF specifications, colormap entries are stored as short values.
> I have a sample file with this color tab (as reported by gdalinfo).
>
> Color Table (RGB with 256 entries)
> 0: *164*,164,164,255
> 1: *255*,255,255,255
> 2: 0,0,0,255
> 3: 0,0,0,255
> .... repeat 0,0,0,255 to the end.
>
> Using an Hex editor or AsTiffTagViewer, I can see the byte values of the
> colormap as stored on the file.
> For the first 4 mappings of the colortable the Red components are:
> *A4 A4* *FF FF* 00 00 00 00
> (8 bytes = 4 shorts)
>
> As far as I have understood, this is related to that part of the
> specification (quoting it, section 5):
>
>
> *In a TIFF ColorMap, all the Red values come first, followed by the Green
> values, then the Blue values. In the ColorMap, black is represented by
> 0,0,0 and white is represented by 65535, 65535, 65535*
>
> So the second entry of the map, being white (255, 255, 255) has its red
> value stored as 65535 = *FF FF *whilst the first color (164,164,164) has
> its red value stored as 42148 = *A4 A4*
>
> I see this behavior is confirmed by the way the geotiff.cpp create the
> colortable:
> https://github.com/OSGeo/gdal/blob/trunk/gdal/frmts/gtiff/geotiff.cpp#L5043
>
> panTRed[iColor] = static_cast<unsigned short>(257 * sRGB.c1);
> panTGreen[iColor] = static_cast<unsigned short>(257 * sRGB.c2);
> panTBlue[iColor] = static_cast<unsigned short>(257 * sRGB.c3)
>
> Applying a color*257 multiplication allows to have its 8 bits color
> representation stored into a short where intensity goes from 0 to 65535.
>
> The issue I have is that when using gdaladdo, the overviews are generated
> with a different color table.
> So that the first 8 bytes of the red component stored in the colormap,as
> reported by AsTiffTagViewer are:
> *A4* 00 *FF* 00 00 00 00 00
>
> When converting it back to a 0-255 color component with the formula
> R*255/65535 it become *163* instead of 164.
>
> I see in the GDAL code that both the IBuildOverviews and
> CreateOverviewsFromSrcOverviews call the CreateTIFFColorTable function
> which multiplies the colorMapEntry by 256 instead of 257.
>
> https://github.com/OSGeo/gdal/blob/trunk/gdal/frmts/gtiff/geotiff.cpp#L9137
>
> This may explain the *A4* 00 *FF* 00 entries in the overview with respect
> to the *A4 A4 FF FF *entries in the main level.
>
> Do you have any feedback on this?
> Please, let me know what do you think about it.
>
> Best Regards,
> Daniele
--
Spatialys - Geospatial professional services
http://www.spatialys.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20161124/b1d44328/attachment-0001.html>
More information about the gdal-dev
mailing list