Сохранение карты в TIF-файле

Предложения и пожелания по дальнейшему развитию ГИС Аксиома
Аватара пользователя
bgnik
Сообщения: 47
Зарегистрирован: 25 окт 2021, 05:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 24 апр 2024, 07:26

Опять торможу... В функцию save_image_to_mono_geotiff мне нужно передать Qg.QImage, а у меня подготовленный Image из модуля PIL. Как выполнить преобразование? Как мне в этом поможет np.asarray? Ну получаю я np.array, а нужен QByteArray. Дальше у меня ступор...
Аватара пользователя
Александр
Сообщения: 438
Зарегистрирован: 18 апр 2019, 08:21

Re: Сохранение карты в TIF-файле

Сообщение Александр » 24 апр 2024, 11:24

Ниже пример.

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.")
Вложения
img.tif
было
(186.39 КБ) 8 скачиваний
img1.tif
стало
(15.63 КБ) 8 скачиваний
Аватара пользователя
bgnik
Сообщения: 47
Зарегистрирован: 25 окт 2021, 05:40

Re: Сохранение карты в TIF-файле

Сообщение bgnik » 25 апр 2024, 12:15

Пришлось несколько изменить код, поскольку функция не работает с монохромным растром (а это именно мой случай).
Вот мой вариант:

Код: Выделить всё

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? Подозреваю, что выполнялось бы быстрее, да и не было бы необходимости использовать внешнюю библиотеку. Вот, только разобраться с обработкой массивов сложнее, мозги съезжают. :o
Ответить