gdal python background not really transparent

When I merge my geotiffs using buildVRT and translate from gdal the transparity is showed as transparity blocks instead of the content of layer behind it.

see image:


used code for merging geotiff:

demList = glob.glob(os.path.dirname(os.path.abspath(__file__)) + "//..//icons//*.tif")

VRToptions = gdal.BuildVRTOptions(srcNodata="255 255 255")
vrt = gdal.BuildVRT(os.path.dirname(os.path.abspath(__file__)) + "//merged.vrt", demList, options=VRToptions)
translateOptions = gdal.TranslateOptions(creationOptions=["TILED=YES"])
gdal.Translate(os.path.dirname(os.path.abspath(__file__)) + "//mergedDEM.tif", vrt, options=translateOptions)
vrt = None

my question is how i can use the previous layer as background instead of the transparity blocks.

Compleet code with problem:


What about this (using rasterio and it’s extension rioxarray) and using both your tifs :

import rioxarray
import rioxarray.merge

icon = "./tiffs/horse2.tif"
background = "./tiffs/4c5ae720f274505972ecedf4066bb32dfb28b63e5785030a7eb55b4e9978602c.tif"

# open the rasters
with rioxarray.open_rasterio('./tiffs/horse2.tif') as rds1:
    with rioxarray.open_rasterio(background) as rds2:

        # ensure the rasters have the same projection/transform/shape
        rds3 =
        ar = rds3.values
        #look for pixels in icon having alpha = 255
        ix = (ar[3] == 255)
        #update background pixels with icon
        for k in range(4):
        #save updated raster"test.tif")

The icon is a bit pixelised, but it’s only because the resolution of you background is less than the one in your icon/tif. Maybe you could reproject both the arrays to the maximum resolution of both layers, but IMHO that would be another subject.

enter image description here

(Note that you icon TIF is ok ; I tried to open it in QGIS and you can superpose the layers alright. I also tried to edit it to re-declare a nodata value, but I still got the same result as you. Maybe if your background and icon tif shared the same nodata value there could be a way to compute it without accessing the pixels as I did,…)