使用terra writeRaster保存JPEG2000时栅格值被修改的问题
Terra保存JPEG2000栅格数值异常的解决办法
可用的JPEG2000驱动
除了JP2OpenJPEG,GDAL还支持JP2ECW、JP2KAK、JP2MrSID这些JP2驱动,但它们大多依赖商业SDK,默认环境里基本用不了,JP2OpenJPEG是最容易获取的开源选项。
数值异常的解决方法
你碰到的数值变化、颜色偏移问题,是JP2OpenJPEG驱动默认编码行为导致的,调整几个关键参数就能解决,直接看可行代码:
library(terra) r <- rast(system.file("ex/logo.tif", package="terra")) # 核心是指定数据类型+无损编码参数 rjp4 <- writeRaster(r, "r.jp4", filetype="JP2OpenJPEG", datatype="INT1U", # 匹配原栅格的8位无符号整数类型 gdal=c("REVERSIBLE=YES", "PROGRESSIVE=NO", "QUALITY=100", "YCBCR420=NO", "YCC=NO")) # 验证数值完全一致 all(values(r) == values(rjp4)) # 输出应该是 [1] TRUE
为什么之前的参数没用?
- 没指定数据类型:原
logo.tif是8位无符号整数,不指定datatype的话,GDAL可能自动转成浮点型,直接导致数值偏差。 - 无损开关没开对:
QUALITY=100不等于无损,必须设置REVERSIBLE=YES才会触发真正的无损压缩。 - 色彩空间偷偷转换:默认可能启用YCbCr色彩转换,强制关掉
YCC和YCBCR420才能避免颜色偏移。
是Bug吗?
不是Terra的Bug,也不是缺失功能——Terra的writeRaster只是把参数传给GDAL,而JP2OpenJPEG的默认编码逻辑本来就不是为无损保存栅格数值设计的,必须手动指定匹配原数据的参数才能得到完全一致的结果。
内容的提问来源于stack exchange,提问作者Jean-Luc Dupouey
相关产品推荐
相关产品推荐

