У меня есть Java-программа, которая записывает некоторые данные, поступившие через сетевой сокет, в mongodb, например:
MongoCollection<Document> documents = mongoDatabase.getCollection(collection);
Document document = new Document("Yams_id", imagePayload.getYamsId());
document.append("file_format", imagePayload.getImageFileFormat());
document.append("image_compression", imagePayload.getImageEncoding());
document.append("MIME", "image/png");
document.append("width_in_pixels", imagePayload.getWidthInPixels());
document.append("height_in_pixels", imagePayload.getHeightInPixels());
document.append("timestamp", imagePayload.getTimestamp());
document.append("data_array_size_in_bytes", imagePayload.getDataArraySizeInBytes());
Binary data = new Binary(imageData);
document.append("image_bytes", data);
documents.insertOne(document);
Я хочу вернуть изображение в Python,для обработки изображений:
import pymongo
from pymongo import MongoClient
import pprint
from bson.json_util import dumps
import json
import bson
from PIL import Image
import io
def get_bytes():
#connect to db
client = MongoClient('IP', 27017)
db = client.wams_image_db
collection = db.client_images_to_process
# extracting most recent document
doc = collection.find().sort([('timestamp',-1)]).limit(1)
json_data=dumps(doc)
data=json.loads(json_data)
#read JSON
width_in_pixels = timestamp=data[0]['width_in_pixels']
height_in_pixels = timestamp=data[0]['height_in_pixels']
mime =data[0]['MIME']
timestamp=data[0]['timestamp']
image_bytes_dict=data[0]['image_bytes'] #json dictionary type
print("width_in_pixels:"+str(width_in_pixels)+",height_in_pixels:"+str(height_in_pixels))
#save to file
image_bytes=json.dumps(image_bytes_dict).encode('utf-8')
#attempt - 1
newFile=open('out.png','wb')
newFileBytes =bytearray(image_bytes)
for byte in newFileBytes:
newFile.write(byte.to_bytes(1, byteorder='big'))
#attempt - 2
#image = Image.frombytes('RGBA', (width_in_pixels,height_in_pixels),image_bytes, 'raw')
#image.save('out.png')
get_bytes()
Моя попытка №1 использует
newFile=open('out.png','wb')
newFileBytes =bytearray(image_bytes)
for byte in newFileBytes:
newFile.write(byte.to_bytes(1, byteorder='big'))
Файл создан, но когда я пытаюсь открыть его, Ошибка Windows говорит: «Похоже, мы не поддерживаем этот формат файла», также попытался byteorder='little'
, однако он выдавал ту же ошибку.
Попытка № 2:
#image = Image.frombytes('RGBA', (width_in_pixels,height_in_pixels),image_bytes, 'raw')
#image.save('out.png')
Ошибка:
повышение ValueError («недостаточно данных изображения»)
Попытка # 3
Когда яиспользуйте формат 'PNG' или 'JPEG':
image = Image.frombytes('RGBA', (width_in_pixels,height_in_pixels),image_bytes, 'JPEG')
image.save('out.png')
Я получаю эту ошибку:
OSError: декодер JPEG недоступен
ИЛИ
OSError: декодер PNG недоступен
Я уверен, что изображения были отправлены правильно, потому что "noSQLBooster" может фактически отображать предварительный просмотр изображения.
Следовательно, как я могу восстановить байты изображения из двоичного типа в mongodb и сохранить его в виде файла?
Спасибо