如何使用 GDAL 将数据保存到 PNG

How to save data to PNG using GDAL

我正在尝试将数据保存为 PNG。文件已创建(尺寸正确,但数据未写入其中。

最小示例代码:

from osgeo import gdal
import numpy as np

# data:
filename = '/tmp/test.png'
nx = 512
ny = 512
n_bands = 3
datatype = gdal.GDT_Byte

# create destination:
dst_driver_tmp = gdal.GetDriverByName('MEM')
dst_tmp = dst_driver_tmp.Create('', xsize=nx, ysize=ny, bands=n_bands, eType=datatype)
dst_driver = gdal.GetDriverByName('PNG')
dst_ds = dst_driver.CreateCopy(filename, dst_tmp, strict=0)
if not dst_ds:
    raise Exception("CreateCopy failed")

# write data:
for i in range(n_bands):
    data = np.array([[i * 0.5]])
    band = dst_ds.GetRasterBand(i + 1).WriteArray(data)

dst_ds.FlushCache()
dst_ds = None

运行 此代码产生错误:

ERROR 6: /tmp/test.png, band 1: WriteBlock() not supported for this dataset.
ERROR 6: /tmp/test.png, band 2: WriteBlock() not supported for this dataset.
ERROR 6: /tmp/test.png, band 3: WriteBlock() not supported for this dataset.

文件已创建并且是有效的 PNG 文件,但图像是黑色的。

我已经尝试更改 eType,使用不同的值、维度、条带数...没有区别。如果重要:

$ gdalinfo --version
GDAL 2.2.2, released 2017/09/15
$ gdalinfo --formats | grep PNG
  PNG -raster- (rwv): Portable Network Graphics

知道如何使用 GDAL 将值写入 PNG 吗?

原来是我误解了CreateCopy的作用。需要将数据写入dst_tmp,最后简单调用CreateCopy,一步生成PNG文件。希望对大家有帮助。