使用 python 将 16 位 GeoTiff 文件转换为 8 位 JPEG 文件



>我正在尝试将 16 位 3 波段 RGB GeoTIFF 文件转换为 8 位 3 波段 JPEG 文件。似乎gdal库应该可以很好地解决这个问题。我的问题是如何在 python gdal API 中指定转换为 8 位输出,以及如何缩放该转换中的值?另外,如何检查输出是 8 位还是 16 位?

gdal.Translate()功能应该服务于目的。但是,我发现的唯一将值重新缩放到 8 位的示例涉及 C 接口。下面的两篇文章提供了这方面的示例,但它们再次不适合我的目的,因为它们没有使用 Python 接口。

https://gis.stackexchange.com/questions/26249/how-to-convert-qgis-generated-tiff-images-into-jpg-jpeg-using-gdal-command-line/26252

https://gis.stackexchange.com/questions/206537/geotiff-to-16-bit-tiff-png-or-bmp-image-for-heightmap/206786

我想出的python代码是:

from osgeo import gdal
gdal.Translate(destName='test.jpg', srcDS='test.tif')

这将起作用,但我认为输出不会被覆盖到 8 位或值被重新缩放。有谁知道如何应用这些特定设置?

请注意,下面的这篇文章非常相似,但使用的是PIL包。但是,问题在于显然PIL无法摄取 16 位映像。当我尝试此代码时,我收到有关读取数据的错误。因此,我无法使用此解决方案。

在 Python 中将 TIFF 转换为 JPEG

你可以使用这样的选项

from osgeo import gdal
scale = '-scale min_val max_val'
options_list = [
'-ot Byte',
'-of JPEG',
scale
] 
options_string = " ".join(options_list)
gdal.Translate('test.jpg',
'test.tif',
options=options_string)

选择您认为适合图像的最小值和最大值,作为min_valmax_val

如果您想将缩放扩展到整个范围,您可以简单地跳过最小值和最大值,只使用scale = '-scale'

我认为 gdal 的方式是使用gdal.TranslateOptions().

from osgeo import gdal
translate_options = gdal.TranslateOptions(format='JPEG',
outputType=gdal.GDT_Byte,
scaleParams=[''],
# scaleParams=[min_val, max_val],
)
gdal.Translate(destName='test.jpg', srcDS='test.tif', options=translate_options)

最新更新