【问题标题】:How to store Images in MongoDB through pymongo?如何通过 pymongo 将图像存储在 MongoDB 中?
【发布时间】:2018-05-19 23:49:54
【问题描述】:
from PIL import Image
from bson import Binary

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

抛出一个错误声明TypeError : data must be an instance of bytes

为什么会这样?以及如何解决这个问题以将 img 存储到 MongoDB?

【问题讨论】:

标签: mongodb python-3.x opencv binary pymongo


【解决方案1】:

只要文档不超过 16MB 标准 bson 就可以了,否则应该使用 gridfs。下面的例子展示了如何在 mongodb 中插入和读回图像。

插入图像.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()

【讨论】:

  • 这是最好的答案,它运作良好并且实际上处理了 pymongo,这是最初的问题!
【解决方案2】:

您需要将图像转换为字节数组。你可以这样做,

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'))

【讨论】:

  • 有谁知道这两种方法中哪一种计算效率更高?
  • 使用@kirk 答案,它更好,实际上处理pymongo 女巫是最初的问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 2019-05-06
  • 2021-12-20
  • 2011-05-29
  • 2012-09-14
  • 1970-01-01
  • 2012-08-16
  • 2021-11-20
相关资源
最近更新 更多