Tif栅格数据类型8位深转1位深

问题描述

使用gdal.GetDriverByName('GTiff').Create方法创建tif文件时,发现无法设置成1位深的数据

经查询发现,GDAL中的GDALDataType是一个枚举型,其中的值为:

  • GDT_Unknown : 未知数据类型
  • GDT_Byte : 8bit正整型 (C++中对应unsigned char)
  • GDT_UInt16 : 16bit正整型 (C++中对应 unsigned short)
  • GDT_Int16 : 16bit整型 (C++中对应 short 或 short int)
  • GDT_UInt32 : 32bit 正整型 (C++中对应unsigned long)
  • GDT_Int32 : 32bit整型 (C++中对应int 或 long 或 long int)
  • GDT_Float32 : 32bit 浮点型 (C++中对应float)
  • GDT_Float64 : 64bit 浮点型 (C++中对应double)
  • GDT_CInt16 : 16bit复整型 (?)
  • GDT_CInt32 : 32bit复整型 (?)
  • GDT_CFloat32 : 32bit复浮点型 (?)
  • GDT_CFloat64 : 64bit复浮点型 (?)

并没有1bit的数据类型,无法写入创建1位深的tif文件


解决方案:

目前想到的办法是先按8位深创建tif,然后用Pillow库读入转1位深,然后再用gdal库读入赋值源文件的投影信息和地理坐标,可以实现最后为1位深的tif

from osgeo import gdal
from PIL import Image

'''
创建新tif文件
out_data = gdal.GetDriverByName('GTiff').Create(output_name, crop_size, crop_size, 1, gdal.GDT_Byte)
'''

# 单通道处理
# 设置tif文件位深度为1位
# 先转灰度图
img_l = Image.open(output_name).convert('L')
# 再转二值图
img_b = img_l.point(lambda x: 0 if x < 1 else 1, '1')
# 保存
img_b.save(output_name)
                
# 如果保存为tif,转位深会丢失投影信息和地理坐标,所以需要重新设置
# 设置投影信息和地理坐标
ds = gdal.Open(output_name, gdal.GA_Update)
ds.SetProjection(proj)
ds.SetGeoTransform(new_transform)
# 释放资源
ds = None

最后,咱也不知道gdal为啥没有类似于c++中的Bool类型,不能直接创建1位深的栅格文件,有大佬知道为啥吗

你可能感兴趣的:(开发语言,python)