>我正在尝试将 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_val
和max_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)