У меня есть база данных PostgreSQL (v 9.6), в которой изображения хранятся как данные bytea
. Я не знаю кодировку изображения. (Я не настраивал эту базу данных, и не ясно, смогу ли я изменить эту настройку, хотя я хотел бы, поскольку хранение больших изображений в базе данных PostgreSQL не является (IIUC) лучшей практикой.)
Я бы хотел извлечь эти данные в изображение или, что еще лучше, прямо в массив NumPy.
Используя SQLAlchemy, я могу подключиться и извлечь данные:
engine = create_engine(postgresql+psycopg2://user:password@server:port/database)
connection = engine.connect()
result = connection.execute('SELECT image FROM database.table LIMIT 1;')
Соответствующее изображение возвращается как memoryview
объект; приведенный как массив numpy
, он выглядит следующим образом (для Cython: преобразование представления памяти в массив NumPy ):
[b'\xaa' b'\x04' b'u' b'\x04' b'\x85' b'\x04' b'E' b'\x04' b'\x7f' b'\x04'
b'\xa5' b'\x04' b'K' b'\x04' b'j' b'\x04' b'\x97' b'\x04' b';' b'\x04'
b'w' b'\x04' b'k' b'\x04' b'E' b'\x04' b'b' b'\x04' b's' b'\x04']
Я попытался сохранить файлы в формате jpg или tiff (за Преобразование BLOB, хранящегося в базе данных, в изображение на веб-сайте HTML ), но не смог открыть полученные файлы с помощью средства просмотра изображений.
Я тоже пробовал это ( Открыть образ PIL из байтового файла ), но получить такой результат:
OSError: cannot identify image file <_io.BytesIO object at 0x000002299F4DD830>
Или, из Как преобразовать шестнадцатеричную строку в цветное изображение в python? , я получаю эту ошибку:
ValueError: non-hexadecimal number found in fromhex() arg at position 0
Итак: Как мне преобразовать эти bytea
данные или этот memoryview
объект в массив NumPy
?
Возможно, мне не хватает чего-то простого, или это может быть одной из причин, по которой изображения не должны храниться в базах данных SQL.