使用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位深的栅格文件,有大佬知道为啥吗