[gdal-dev] More information to understand ColorTables in GeoTiffs

Frank Warmerdam warmerdam at pobox.com
Fri Mar 8 16:09:54 PST 2013


On Fri, Mar 8, 2013 at 2:05 PM, Robert Nix <robert at urban4m.com> wrote:
> Let me adjust my question. I changed the color-table code to:
>
> c = gdal.ColorTable(gdal.GCI_PaletteIndex)
> n = c.SetColorEntry(1,[255,128,0,0])
> m = c.SetColorEntry(65535,[0,128,255,255])
> c.CreateColorRamp(1,n,65535,m)
> band.SetColorTable(c)
>
>
> I discovered that the 64K colors are due to the UInt16 (tested GDT_Byte and
> got 255) so i realized that maybe i need to create a ramp?

Robert,

I will note that the TIFF format does not support "short colormaps".
So if the type of the pixel is 8bit byte then the color table will be
exactly 256 entries even if you only put in one color.  Frr UInt16 it
will be 65536.  Most other colormap supporting formats do not impose
this.

> But the above code fails with:
>
> Traceback (most recent call last):
>   File "makecolortable.py", line 14, in <module>
>     n = c.SetColorEntry(1,[255,128,0,0])
>   File "/usr/lib/python2.7/dist-packages/osgeo/gdal.py", line 1113, in
> SetColorEntry
>     return _gdal.ColorTable_SetColorEntry(self, *args)
> TypeError: Invalid values in ColorEntry sequence
>
>
> That sequence appears correct as all four values meet the short requirement,
> (i think this is the code that produces the error):
>
> if ( !PyArg_ParseTuple( $input,"hhh|h", &ce.c1, &ce.c2, &ce.c3, &ce.c4 ) ) {
>
>   PyErr_SetString(PyExc_TypeError, "Invalid values in ColorEntry sequence
> ");


I think the problem is that you switched from tuples to lists (ie.
from (r,g,b,a) to [r,g,b,a]).

Also, FYI, TIFF does not support alpha in colormaps.

Best regards,
Frank

> --nix
>
> On Mar 8, 2013, at 16:35, Robert Nix <robert at urban4m.com> wrote:
>
> Hi,
>
> I'm trying to add a color table to a 1-band UInt16 GeoTiff with Python as
> follows:
>
> import numpy as np
> import gdal
>
> driver = gdal.GetDriverByName('GTiff')
> dst_ds = driver.Create('testcolor.tif', 100, 100, 1, gdal.GDT_UInt16)
>
> band = dst_ds.GetRasterBand(1)
> band.SetRasterColorInterpretation(gdal.GCI_PaletteIndex)
>
> c = gdal.ColorTable(gdal.GCI_PaletteIndex)
> c.SetColorEntry(1,(255,127,0,63))
> band.SetColorTable(c)
>
> a = np.random.randint(1,10,size=(100,100))
> band.WriteArray(a)
>
> dst_ds = None
>
>
> The problem is that when i run gdalinfo on the testcolor.tif, it lists 65535
> color table entries:
>
> Driver: GTiff/GeoTIFF
> Files: testcolor.tif
>        testcolor.tif.aux.xml
> Size is 100, 100
> Coordinate System is `'
> Image Structure Metadata:
>   INTERLEAVE=BAND
> Corner Coordinates:
> Upper Left  (    0.0,    0.0)
> Lower Left  (    0.0,  100.0)
> Upper Right (  100.0,    0.0)
> Lower Right (  100.0,  100.0)
> Center      (   50.0,   50.0)
> Band 1 Block=100x40 Type=UInt16, ColorInterp=Palette
>   Color Table (RGB with 65536 entries)
>     0: 1,0,0,255
>     1: 1,0,0,255
>     2: 0,0,0,255
>     3: 0,0,0,255
> ...
>   65533: 0,0,0,255
>   65534: 0,0,0,255
>   65535: 0,0,0,255
>
>
> What's going on … besides the fact that maybe i'm not understanding
> color-tables? If it's clear i don't understand, is there a good resource for
> understanding color-tables? Or must I go learn the source code (which i
> really don't have to do)?
>
> Thanks
> --nix
>
>
>
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev



-- 
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up   | Frank Warmerdam, warmerdam at pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush    | Geospatial Software Developer


More information about the gdal-dev mailing list