如何通过pymongo将图片存储在MongoDB中?

8
from PIL import Image
from bson import Binary

img = Image.open('test.jpg')
img = Binary(img)

会抛出一个错误,错误信息为TypeError : data must be an instance of bytes

为什么会出现这个错误?如何解决并将图像存储到MongoDB中?


您可以查看以下答案: https://dev59.com/aGfWa4cB1Zd3GeqPeSuH#11916520 - Moi Syme
@MoiSyme 尝试了,不起作用。抛出 TypeError。 - Rahul Dev
2个回答

11
只要文档不超过16MB的标准bson,就可以使用它,否则应该使用gridfs。下面的示例显示了如何从mongodb中插入并读取图像。
insert_image.py
from pymongo import MongoClient
from PIL import Image
import io

client = MongoClient()
db = client.testdb
images = db.images

im = Image.open("./image.jpg")

image_bytes = io.BytesIO()
im.save(image_bytes, format='JPEG')

image = {
    'data': image_bytes.getvalue()
}

image_id = images.insert_one(image).inserted_id

read_image.py

from pymongo import MongoClient
from bson.binary import Binary
from PIL import Image
import io
import matplotlib.pyplot as plt

client = MongoClient()
db = client.testdb
images = db.images
image = images.find_one()

pil_img = Image.open(io.BytesIO(image['data']))
plt.imshow(pil_img)
plt.show()

1
这是最好的答案,它运行良好并且确实处理了 pymongo,这正是原问题所在! - Jacob Philpott

3
您需要将图像转换为字节数组。可以按照以下方式操作:
from PIL import Image
from bson import Binary

img = Image.open('test.jpg')

imgByteArr = io.BytesIO()
img.save(imgByteArr, format='PNG')
imgByteArr = imgByteArr.getvalue()

你可以尝试将imgByteArr保存到Mongo中。 或者 你可以将图像转换为字符串,然后将其存储在Mongo中。
import base64

with open("test.jpg", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
    //store str in mongo

获取图像的方法如下:
with open("test2.jpg", "wb") as fimage:
    fimage.write(str.decode('base64'))

4
有人知道这两种方法哪一种计算效率更高吗? - beedrill
请使用@kirk的答案,它更好,并且实际上涉及了原始问题中的pymongo。 - Jacob Philpott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接