import os import numpy as np from osgeo import gdal input_folder = 'G:/xianlinhotel/xlh632envi' output_folder = "G:/xianlinhotel/xlh_nir_rg_632envicai" target_width = 1230 target_height = 910 for filename in os.listdir(input_folder): if filename.endswith(".tif"): tif_path = os.path.join(input_folder, filename) tif_dataset = gdal.Open(tif_path) if tif_dataset is not None and tif_dataset.RasterXSize == 1280 and tif_dataset.RasterYSize == 960: data = tif_dataset.ReadAsArray() x_offset = (tif_dataset.RasterXSize - target_width) // 2 y_offset = (tif_dataset.RasterYSize - target_height) // 2 new_data = data[:, y_offset:y_offset+target_height, x_offset:x_offset+target_width] output_path = os.path.join(output_folder, filename) driver = gdal.GetDriverByName("GTiff") new_dataset = driver.Create(output_path, target_width, target_height, tif_dataset.RasterCount, tif_dataset.GetRasterBand(1).DataType) geotransform = tif_dataset.GetGeoTransform() new_geotransform = (geotransform[0] + x_offset * geotransform[1], geotransform[1], geotransform[2], geotransform[3] + y_offset * geotransform[5], geotransform[4], geotransform[5]) new_dataset.SetGeoTransform(new_geotransform) new_dataset.SetProjection(tif_dataset.GetProjection()) for i in range(1, tif_dataset.RasterCount + 1): new_dataset.GetRasterBand(i).WriteArray(new_data[i - 1]) new_dataset = None # 关闭数据集以保存文件和释放资源 print(f"Saved {filename} to {output_path}") else: print(f"{filename} has invalid size or is not a TIFF file.") tif_dataset = None # 关闭数据集以释放资源 详细解释
时间: 2023-12-29 17:05:06 浏览: 33
这是一个Python脚本,用于将指定文件夹中的所有大小为1280x960的TIFF文件裁剪为指定大小并保存到另一个文件夹中。
以下是对代码的详细解释:
```python
import os
import numpy as np
from osgeo import gdal
# 定义输入文件夹路径、输出文件夹路径和裁剪后的目标宽度和高度
input_folder = 'G:/xianlinhotel/xlh632envi'
output_folder = "G:/xianlinhotel/xlh_nir_rg_632envicai"
target_width = 1230
target_height = 910
# 遍历文件夹中的所有文件
for filename in os.listdir(input_folder):
if filename.endswith(".tif"): # 如果文件是TIFF文件
tif_path = os.path.join(input_folder, filename) # 构造完整的文件路径
tif_dataset = gdal.Open(tif_path) # 读取TIFF文件
# 如果TIFF文件存在且大小为1280x960
if tif_dataset is not None and tif_dataset.RasterXSize == 1280 and tif_dataset.RasterYSize == 960:
data = tif_dataset.ReadAsArray() # 读取TIFF文件中的像素数据
# 计算裁剪后的左上角坐标
x_offset = (tif_dataset.RasterXSize - target_width) // 2
y_offset = (tif_dataset.RasterYSize - target_height) // 2
# 对像素数据进行裁剪
new_data = data[:, y_offset:y_offset+target_height, x_offset:x_offset+target_width]
# 构造输出文件路径,并创建输出文件
output_path = os.path.join(output_folder, filename)
driver = gdal.GetDriverByName("GTiff")
new_dataset = driver.Create(output_path, target_width, target_height, tif_dataset.RasterCount, tif_dataset.GetRasterBand(1).DataType)
# 设置输出文件的地理参考和投影信息
geotransform = tif_dataset.GetGeoTransform()
new_geotransform = (geotransform[0] + x_offset * geotransform[1], geotransform[1], geotransform[2], geotransform[3] + y_offset * geotransform[5], geotransform[4], geotransform[5])
new_dataset.SetGeoTransform(new_geotransform)
new_dataset.SetProjection(tif_dataset.GetProjection())
# 将裁剪后的像素数据写入输出文件
for i in range(1, tif_dataset.RasterCount + 1):
new_dataset.GetRasterBand(i).WriteArray(new_data[i - 1])
new_dataset = None # 关闭输出文件以保存和释放资源
print(f"Saved {filename} to {output_path}")
else:
print(f"{filename} has invalid size or is not a TIFF file.")
tif_dataset = None # 关闭输入文件以释放资源
```
首先,我们导入了需要使用的模块,包括`os`、`numpy`和`gdal`。其中,`os`模块用于操作文件和文件夹,`numpy`模块用于处理像素数据,`gdal`模块用于读取和写入TIFF文件。
然后,我们定义了输入文件夹路径、输出文件夹路径和裁剪后的目标宽度和高度。这些变量用于在脚本中重复使用。
接下来,我们使用`os.listdir()`函数遍历输入文件夹中的所有文件,并使用`filename.endswith(".tif")`判断文件是否是TIFF文件。如果是TIFF文件,我们构造完整的文件路径并使用`gdal.Open()`函数读取TIFF文件。
然后,我们检查TIFF文件的大小是否为1280x960。如果是,我们使用`gdal.Dataset.ReadAsArray()`函数读取TIFF文件中的像素数据,并计算裁剪后的左上角坐标。我们使用`numpy`模块对像素数据进行裁剪,并构造输出文件路径。然后,我们使用`gdal.GetDriverByName()`函数创建输出文件,并将裁剪后的像素数据写入输出文件。最后,我们关闭输入文件和输出文件以释放资源,并输出保存的文件路径。
如果文件不是TIFF文件或大小不是1280x960,则输出相应的错误信息。
希望这份解释能够帮助您理解这段代码的功能和实现方法。