On Fri, 22 Apr 2022 at 07:05, <matt.wil...@yukon.ca> wrote:
>
> Idea for a small but useful python tool: scan image for min/max values and 
> convert to smallest possible bit depth without losing values. Surely someone 
> has done something like this already. Any suggestions for where to look for 
> prior art?

This is driver-specific, as certain formats expect multiples of 2
(e.g.) NBITS=1/2/4. But for GTiff, what I typically use in a script is
to find the maximum value, then use "ceil(log(maxval, 2))" to get the
number of bits, e.g.:

from math import ceil, log
from osgeo import gdal

maxval = 17  # for example
nbits = ceil(log(maxval, 2))  # 5

drv = gdal.GetDriverByName("GTiff")
opts = [f"NBITS={maxval}"]
ds = drv.Create(fname, nx, ny, 1, gdal.GDT_Byte, opts)
...

similar can be done with rasterio, passing the keyword
"rasterio.open(fname, 'w', ..., nbits=nbits)"

For the drivers that expect NBITS as a multiple of 2:

nbits = 2**ceil(log(nbits, 2))

If nbits is greater than 8, then UInt16 or UInt32 may be required, as
supported by the driver.
_______________________________________________
gdal-dev mailing list
gdal-dev@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/gdal-dev

Reply via email to