def get_color_table( color_palette_or_path_or_strings_or_ds: ColorPaletteOrPathOrStrings, min_key=0, max_key=255, fill_missing_colors=True) -> Optional[gdal.ColorTable]: if (color_palette_or_path_or_strings_or_ds is None or isinstance( color_palette_or_path_or_strings_or_ds, gdal.ColorTable)): return color_palette_or_path_or_strings_or_ds if isinstance(color_palette_or_path_or_strings_or_ds, gdal.Dataset): return get_color_table_from_raster( color_palette_or_path_or_strings_or_ds) pal = get_color_palette(color_palette_or_path_or_strings_or_ds) if pal is None: return get_color_table_from_raster( color_palette_or_path_or_strings_or_ds) color_table = gdal.ColorTable() if fill_missing_colors: keys = sorted(list(pal.pal.keys())) if min_key is None: min_key = keys[0] if max_key is None: max_key = keys[-1] c = pal.color_to_color_entry(pal.pal[keys[0]]) for key in range(min_key, max_key + 1): if key in keys: c = pal.color_to_color_entry(pal.pal[key]) color_table.SetColorEntry(key, c) else: for key, col in pal.pal.items(): color_table.SetColorEntry( key, pal.color_to_color_entry(col)) # set color for each key return color_table
def get_color_table(color_palette_or_path_or_strings_or_ds: Optional[ColorTableLike], **kwargs) -> Optional[gdal.ColorTable]: if (color_palette_or_path_or_strings_or_ds is None or isinstance(color_palette_or_path_or_strings_or_ds, gdal.ColorTable)): return color_palette_or_path_or_strings_or_ds if isinstance(color_palette_or_path_or_strings_or_ds, gdal.Dataset): return get_color_table_from_raster(color_palette_or_path_or_strings_or_ds) try: pal = get_color_palette(color_palette_or_path_or_strings_or_ds) color_table = gdal.ColorTable() res = color_table_from_color_palette(pal, color_table, **kwargs) return color_table if res else None except: # the input might be a filename of a raster file return get_color_table_from_raster(color_palette_or_path_or_strings_or_ds)
def pct2rgb(src_filename: PathLikeOrStr, pct_filename: Optional[PathLikeOrStr], dst_filename: PathLikeOrStr, band_number: int = 1, out_bands: int = 3, driver_name: Optional[str] = None): # Open source file src_ds = open_ds(src_filename) if src_ds is None: raise Exception(f'Unable to open {src_filename} ') src_band = src_ds.GetRasterBand(band_number) # ---------------------------------------------------------------------------- # Ensure we recognise the driver. if driver_name is None: driver_name = GetOutputDriverFor(dst_filename) dst_driver = gdal.GetDriverByName(driver_name) if dst_driver is None: raise Exception(f'"{driver_name}" driver not registered.') # ---------------------------------------------------------------------------- # Build color table. if pct_filename is not None: pal = get_color_palette(pct_filename) if pal.has_percents(): min_val = src_band.GetMinimum() max_val = src_band.GetMinimum() pal.apply_percent(min_val, max_val) ct = get_color_table(pal) else: ct = src_band.GetRasterColorTable() ct_size = ct.GetCount() lookup = [np.arange(ct_size), np.arange(ct_size), np.arange(ct_size), np.ones(ct_size) * 255] if ct is not None: for i in range(ct_size): entry = ct.GetColorEntry(i) for c in range(4): lookup[c][i] = entry[c] # ---------------------------------------------------------------------------- # Create the working file. if driver_name.lower() == 'gtiff': tif_filename = dst_filename else: tif_filename = 'temp.tif' gtiff_driver = gdal.GetDriverByName('GTiff') tif_ds = gtiff_driver.Create(tif_filename, src_ds.RasterXSize, src_ds.RasterYSize, out_bands) # ---------------------------------------------------------------------------- # We should copy projection information and so forth at this point. tif_ds.SetProjection(src_ds.GetProjection()) tif_ds.SetGeoTransform(src_ds.GetGeoTransform()) if src_ds.GetGCPCount() > 0: tif_ds.SetGCPs(src_ds.GetGCPs(), src_ds.GetGCPProjection()) # ---------------------------------------------------------------------------- # Do the processing one scanline at a time. progress(0.0) for iY in range(src_ds.RasterYSize): src_data = src_band.ReadAsArray(0, iY, src_ds.RasterXSize, 1) for iBand in range(out_bands): band_lookup = lookup[iBand] dst_data = np.take(band_lookup, src_data) tif_ds.GetRasterBand(iBand + 1).WriteArray(dst_data, 0, iY) progress((iY + 1.0) / src_ds.RasterYSize) # ---------------------------------------------------------------------------- # Translate intermediate file to output format if desired format is not TIFF. if tif_filename == dst_filename: dst_ds = tif_ds else: dst_ds = dst_driver.CreateCopy(dst_filename or '', tif_ds) tif_ds = None gtiff_driver.Delete(tif_filename) return dst_ds