5

Trying to add some Transparency / Opacity to my GeoTiff raster files for a better rendering option when overlapping.

Without transparency

Without transparency

With transparency 20%

With transparency 20%

Is there any gdal command to achieve this?

Driver: GTiff/GeoTIFF
Files: Gb_127_d_D_0006_georefYCBCR_CJPEG.TIF
       Gb_127_d_D_0006_georefYCBCR_CJPEG.tfw
Size is 14013, 13566
Coordinate System is:
PROJCS["CH1903 / LV03",
    GEOGCS["CH1903",
        DATUM["CH1903",
            SPHEROID["Bessel 1841",6377397.155,299.1528128000008,
                AUTHORITY["EPSG","7004"]],
            TOWGS84[674.4,15.1,405.3,0,0,0,0],
            AUTHORITY["EPSG","6149"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4149"]],
    PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],
    PARAMETER["latitude_of_center",46.95240555555556],
    PARAMETER["longitude_of_center",7.439583333333333],
    PARAMETER["azimuth",90],
    PARAMETER["rectified_grid_angle",90],
    PARAMETER["scale_factor",1],
    PARAMETER["false_easting",600000],
    PARAMETER["false_northing",200000],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AUTHORITY["EPSG","21781"]]
Origin = (541546.758578460663557,152626.253885675920174)
Pixel Size = (0.031810463058218,-0.031810463058218)
Metadata:
  AREA_OR_POINT=Area
Image Structure Metadata:
  COMPRESSION=JPEG
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  541546.759,  152626.254) (  6d40'39.68"E, 46d31'25.15"N)
Lower Left  (  541546.759,  152194.713) (  6d40'39.88"E, 46d31'11.17"N)
Upper Right (  541992.519,  152626.254) (  6d41' 0.60"E, 46d31'25.29"N)
Lower Right (  541992.519,  152194.713) (  6d41' 0.79"E, 46d31'11.31"N)
Center      (  541769.639,  152410.484) (  6d40'50.24"E, 46d31'18.23"N)
Band 1 Block=256x256 Type=Byte, ColorInterp=Red
  Overviews: 7007x6783, 3504x3392, 1752x1696, 876x848
  Mask Flags: PER_DATASET ALPHA
  Overviews of mask band: 7007x6783, 3504x3392, 1752x1696, 876x848
Band 2 Block=256x256 Type=Byte, ColorInterp=Green
  Overviews: 7007x6783, 3504x3392, 1752x1696, 876x848
  Mask Flags: PER_DATASET ALPHA
  Overviews of mask band: 7007x6783, 3504x3392, 1752x1696, 876x848
Band 3 Block=256x256 Type=Byte, ColorInterp=Blue
  Overviews: 7007x6783, 3504x3392, 1752x1696, 876x848
  Mask Flags: PER_DATASET ALPHA
  Overviews of mask band: 7007x6783, 3504x3392, 1752x1696, 876x848
Band 4 Block=256x256 Type=Byte, ColorInterp=Alpha
  Overviews: 7007x6783, 3504x3392, 1752x1696, 876x848

EDIT : Proposed workflow to enable transparency on raster data containing no_data values

In my case I had RGBA rasters with no-data values:

Explode bands into one rgb file and one transparency file:

os.system("gdal_translate -b 1 -b 2 -b 3 " + infile + " " +  rgbfile)
os.system("gdal_translate -b 4 " + infile + " " +  transfile)

Compute desired transparency

os.system("gdal_calc -A " + transfile + " --outfile="+ transfilemoded + " --calc=(A/5*4)")
# A was 255 in my case for all data values, 0 for no_data values 
# Hint: since we're in Byte, 255*5/4 = 50 and 255/5*4 = 204 

Merge the produced rgb and new transparency file

os.system("gdal_merge " + rgbfile + " " + transfilemoded + " -o " + rgbafile + " -separate")
  • Depending on your software you could simply make the layer transparent or use specific blending modes. Try QGIS! – bugmenot123 Feb 16 '17 at 13:48
  • 2
    A tricky way that might work: Explode the bands to separate R-G-B-A tiffs with gdal_translate and -b option. Then edit A.tif with gdal_calc.py gdal_calc.py -A A.tif --outfile A2.tif --type=Byte --calc="A+52". Then combine R+G+B+A2 back with gdal_merge.py. – user30184 Feb 16 '17 at 14:03
  • @bugmeno123 actually my goal was to tile these rasters for a webapp afterwards, I could maybe have used a qgis server to use the wms service to generate the source for the tiles. – Nono Jul 14 '17 at 12:26
7

Your gdalinfo dump looks like the raster already has 4 bands and is interpreted as RGBA. This answer will assume you are starting from a 3-band RGB 8-bit/channel image.

First create a single-band 8-bit image which has the desired alpha value (alpha 255 is fully opaque, 0 is fully transparent). You said you want about 20% transparency, so 80% opacity => ~200.

gdal_calc.py -A RGB.tif --A_band=1 --outfile="alpha.tif" \
  --calc="200" --type=Byte

Edit the nodata value so it isn't 255 (default from gdal_calc.py).

gdal_edit.py -unsetnodata alpha.tif

Merge the RGB and alpha images, separating the bands.

gdal_merge.py RGB.tif alpha.tif -o RGBA.tif -separate
|improve this answer|||||
  • Do not assume starting from RGB when RGBA is at stake! :P Ty, I managed to do the job with the previous informations, using gdal_translate, gdal_calc and gdal_merge. I'll Edit my post since this was an interesting workflow. – Nono Jul 14 '17 at 12:22
  • I used --calc=A/5*4 to get my 80 % transparency, avoid nodata value to get a 200 assignement (since no mask is possible on gdal_calc). Hint since we're in Byte, 255*5/4 = 50 and 255/5*4 = 204 – Nono Jul 14 '17 at 12:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.