Сохранение карты в TIF-файле
Re: Сохранение карты в TIF-файле
Опять торможу... В функцию save_image_to_mono_geotiff мне нужно передать Qg.QImage, а у меня подготовленный Image из модуля PIL. Как выполнить преобразование? Как мне в этом поможет np.asarray? Ну получаю я np.array, а нужен QByteArray. Дальше у меня ступор...
Re: Сохранение карты в TIF-файле
Ниже пример.
Code: Select all
from pathlib import Path
from PIL import Image
import numpy as np
from osgeo import gdal
def save_pil_image_to_mono_geotiff(img: Image, filename: Path, dpi: float) -> None:
driver: gdal.Driver = gdal.GetDriverByName("GTiff")
np_data = np.asarray(img)
np_data = 1 - np.min(np_data, 2) // 255
try:
ds: gdal.Dataset = driver.Create(
str(filename),
np_data.shape[1],
np_data.shape[0],
1,
gdal.GDT_Byte,
options=['COMPRESS=CCITTFAX4', 'NBITS=1', 'PHOTOMETRIC=MINISWHITE']
)
ds.SetMetadata({'TIFFTAG_XRESOLUTION': dpi, 'TIFFTAG_YRESOLUTION': dpi})
ds.WriteArray(np_data)
ds.FlushCache()
finally:
ds = None # noqa
# Пример использования.
img = Image.open(r"c:\tmp\img.tif")
save_pil_image_to_mono_geotiff(img, Path(r'c:\tmp\img1.tif'), 96)
print("Completed.")
Re: Сохранение карты в TIF-файле
Пришлось несколько изменить код, поскольку функция не работает с монохромным растром (а это именно мой случай).
Вот мой вариант:
Теперь все ОК.
Вот, что интересно: мне потребовалось для получения исходного изображения использовать PIL, т.к. нужно было наложить друг на друга два растра с использованием маски. А можно ли проделать это при помощи Numpy? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают.
Вот мой вариант:
Код: Выделить всё
def save_pil_image_to_mono_geotiff(img: Image, filename: Path, dpi: float) -> None:
driver: gdal.Driver = gdal.GetDriverByName("GTiff")
np_data = np.asarray(img)
np_data =(np_data==0).astype("int8")
try:
ds: gdal.Dataset = driver.Create(
str(filename),
np_data.shape[1], #width
np_data.shape[0], #height
1,
gdal.GDT_Byte,
options=['COMPRESS=CCITTFAX4', 'NBITS=1', 'PHOTOMETRIC=MINISWHITE']
)
ds.SetMetadata({'TIFFTAG_XRESOLUTION': dpi, 'TIFFTAG_YRESOLUTION': dpi})
ds.WriteArray(np_data)
ds.FlushCache()
finally:
ds = None # noqa
Вот, что интересно: мне потребовалось для получения исходного изображения использовать PIL, т.к. нужно было наложить друг на друга два растра с использованием маски. А можно ли проделать это при помощи Numpy? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают.