Сохранить изображение из байтовых данных с помощью python gdal - PullRequest
0 голосов
/ 28 мая 2020

Я получаю изображение Sentinel-2 с метаданными с сервера ArcGIS REST API. Это строка байтов. В настоящее время я сначала записываю данные в tif-файл с помощью f.write (). Затем я открываю его с помощью imageio, а затем сохраняю как geoTIFF с помощью gdal.

Я хотел бы сохранить изображение напрямую как geoTIFF с помощью gdal. Но я не понял, как извлечь изображение в виде массива numpy непосредственно из байтовых данных или как использовать gdal для записи изображения непосредственно из байтовых данных. Я использую Python 3.8 и Windows 10.

import requests
from imageio import imread
from osgeo import gdal

response = requests.get(im_url, auth=auth)  # call image url
im_binary = response.content  # the image in binary format
im_newpath = 'testimage.tif'
with open(im_newpath, 'wb') as f: 
     f.write(im_binary)

print(type(im_binary))

print(im_binary[0:50])

возвращает:

<class 'bytes'>

b'II*\x00\x08\x00\x00\x00\x15\x00\x00\x01\x03\x00\x01\x00\x00\x00X\x02\x00\x00\x01\x01\x03\x00\x01\x00\x00\x00\x90\x01\x00\x00\x02\x01\x03\x00\r\x00\x00\x00\n\x01\x00\x00\x03\x01\x03\x00'

Мои попытки декодировать данные пока не дали результатов.

decoded = im_binary.decode('utf_16')

UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 364-365: illegal UTF-16 surrogate

Игнорирование или замена ошибок дает различные c символы, отличные от nunmeri. Есть какие-нибудь советы?

1 Ответ

0 голосов
/ 29 мая 2020

Подводя итог моим комментариям и выводам из ответов:

Кажется, в подходе нет ничего плохого. Поскольку изображения состоят из чистых двоичных данных, процедуры декодирования UTF не используются.

Я не понимаю необходимости какого-либо другого декодирования. Полученные данные выглядят как прекрасные данные TIFF.

Хотя запись во временный файл только для того, чтобы передать файл в другую библиотеку, кажется неуклюжей, это надежный и чистый способ продолжить. Вероятно, физического файла можно избежать, используя экземпляр StringIo , но поскольку для этого требуется, чтобы в памяти хранились все данные изображения, это может не работать для огромных изображений. (Я не уверен, как в этом случае должен выглядеть URL-адрес, который должен быть передан tom imread() - кажется, еще один аргумент для использования файла).

...