Прочитайте обратно org.bson.types.Binary как изображение и сохраните как файл - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть 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 и сохранить его в виде файла?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...