[GIS] ERROR 1: Error : band 1 has no color table

convertgdal-translategeotiff-tiffpngqgis

I would like to convert a GeoTIFF to PNG or JPEG RGB, and my GeoTIFF is stripped of a lot of valuable data (I think..)

I am on ubuntu and I am using gdal_translate to try and make a GeoTIFF turn into a regular PNG.

The GeoTIFF I have 'works'. I know because I can view it in QGIS on my Mac.

My GeoTIFF has 8 bands and I dont know which band corresponds to RGBA or what the other 4 bands stand for. It appears none of the bands have a valid 'color table'

  gdal_translate -of PNG test.tiff output.png

gives me

  ERROR 6: PNG driver doesn't support 8 bands.  Must be 1 (grey), 2 (grey+alpha), 3 (rgb) or 4 (rgba) bands.

When I try and just use any combination of bands for RGBA like this:

 gdal_translate -of PNG -b 1 -b 2 -b 3 test.tiff output.png

I just get a black image

In QGIS if I right click on my image and go to properties > Symbology, I see that the redband is band 1 (grey) (min 0, max 439, the green band is band 2 (min 0, max 460), the blue band is band 3 (min 0, max 454). and the image appears nicely in rgb – so the GeoTIFF 'works'.

I've also tried to make a gray image (even though I want an RGB), just because it looks like QGIS is saying band 1 is gray

  gdal_translate -of PNG -expand gray -b 1 test.tiff output.png

but that gives me

  ERROR 1: Error : band 1 has no color table

I dont really know what else to try, or if my image is black because I need to do something with 'scales' or something?

When I run tiffdump on my file I get

Magic: 0x4949 <little-endian> Version: 0x2a <ClassicTIFF>
Directory 0: offset 8 (0x8) next 0 (0)
ImageWidth (256) SHORT (3) 1<2604>
ImageLength (257) SHORT (3) 1<2233>
BitsPerSample (258) SHORT (3) 8<16 16 16 16 16 16 16 16>
Compression (259) SHORT (3) 1<1>
Photometric (262) SHORT (3) 1<1>
StripOffsets (273) LONG (4) 2233<18288 59952 101616 143280 184944 226608 268272 309936 351600 393264 434928 476592 518256 559920 601584 643248 684912 726576 768240 809904 851568 893232 934896 976560 ...>
SamplesPerPixel (277) SHORT (3) 1<8>
RowsPerStrip (278) SHORT (3) 1<1>
StripByteCounts (279) LONG (4) 2233<41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 41664 ...>
PlanarConfig (284) SHORT (3) 1<1>
ExtraSamples (338) SHORT (3) 7<0 0 0 0 0 0 0>
SampleFormat (339) SHORT (3) 8<1 1 1 1 1 1 1 1>
33550 (0x830e) DOUBLE (12) 3<2.20356e-06 2.20356e-06 0>
33922 (0x8482) DOUBLE (12) 6<0 0 0 -82.0121 27.3184 0>
34735 (0x87af) SHORT (3) 32<1 1 0 7 1024 0 1 2 1025 0 1 1 2048 0 1 4326 2049 34737 7 0 2054 0 1 9102 ...>
34736 (0x87b0) DOUBLE (12) 2<298.257 6.37814e+06>
34737 (0x87b1) ASCII (2) 8<WGS 84|\0>

gdalinfo returns

Band 1 Block=2604x1 Type=UInt16, ColorInterp=Gray
Band 2 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 3 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 4 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 5 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 6 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 7 Block=2604x1 Type=UInt16, ColorInterp=Undefined
Band 8 Block=2604x1 Type=UInt16, ColorInterp=Undefined

Best Answer

You can try to run a command with the options that handle the input bands in the best way possible and result in a well-constructed image similar to the one shown by qgis:

gdal_translate -ot Byte -of PNG -b 1 -b 2 -b 3 -scale_1 0 439 -scale_2 0 460 -scale_3 0 454 -a_nodata none -colorinterp_1 red -colorinterp_2 green -colorinterp_3 blue test.tiff output.png

UPDATE (based on comments):

The answer works for GDAL >= 2.3.
Previous versions of GDAL do not support the -colorinterp option.
In that case, the solution is taking advantage of the PHOTOMETRIC=RGB creation option:

gdal_translate -ot Byte -of PNG -b 1 -b 2 -b 3 -scale_1 0 439 -scale_2 0 460 -scale_3 0 454 -a_nodata none test.tiff output.png -co PHOTOMETRIC=RGB
Related Question