首页 > 解决方案 > Jpeg 图像:zlib.error:解压缩数据时出现错误 -3:标头检查不正确

问题描述

我有一个 jpg 图像在内存中,因此以字节为单位。然后我用以下压缩它:

zlib.compress(pickle.dumps(self.fileInstance))

我将其压缩以将其存储到 MongoDB 数据库中。此图像是我保存的记录中的元素之一。我用以下内容保存。

list_search_result = list(search_result)
json_search_result = json.dumps(list_search_result, cls=Encoder, indent=2)

我遇到了字节和 Json 错误,所以我只需将字节图像转换为具有以下内容的字符串。

from bson.objectid import ObjectId
import json 
import datetime
class Encoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, ObjectId):
            return str(obj)
        elif isinstance(obj, datetime.datetime):
            return str(obj)
        elif isinstance(obj,bytes):
            return str(obj)
        return super(Encoder, self).default(obj)

现在,我想从 json 文件中恢复图像。我认为以相反的顺序执行相同的步骤会起作用,但不行。

所以这是我要做的存储:

image -> pickle -> compress -> str -> json

我认为这会起作用:

json -> bytes -> decompress -> depickle -> image

我在以下期间收到zlib.error : Error -3

  image = pickle.load(zlib.decompress(attachment[1].encode()))

  image = io.BytesIO(image)
  dt = Image.open(image)

编辑:

好的,所以我在玩弄,我认为问题可能出在.encode(). 我从b" ". 之后str(b" "),我得到了"b' '"。如果我这样做.encode(),我会得到b"b' '"。我该如何处理?

标签: pythonjsonpython-3.xpicklezlib

解决方案


str()对显示某些东西很有用——它创建了人类可读的文本。

它可能表明您有字节("b''"),或者它可能显示字符串,例如\xe0无法转换为字符的值。但它不必创建对保存在数据库中有用的文本。

许多数据库都有保留字节的字段,然后您可以将图像保留为字节(无需转换为可能只会添加更多字节的泡菜,并且无需压缩,因为图像已经使用了一些压缩)

如果您必须将文件保留(或通过互联网发送)为字符串,那么最好将其转换为base64. 而这种方法被一些APIs人用来发送图像JSON


将图像转换为base64

import base64

fh = open('lenna.png', 'rb')
data = fh.read()
fh.close()

data = base64.b64encode(data).decode()

print(text[:100])  # text

# ... save in database ...

将base64转换为图像

# ... read from database ...

data = base64.b64decode(text.encode())

print(data[:100])  # bytes

fh = open('lenna.png', 'wb')
fh.write(data)
fh.close()

结果:

# text

iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4nOzbXa5tS5Il5DHMzH3OtfY+

# bytes 

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x02\x00\x00\x00\x02\x00\x08\x02\x00\x00\x00{\x1aC\xad\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\x00 \x00IDATx\x9c\xec\xdb]\xaemK\x92%\xe41\xcc\xcc}\xce\xb5\xf6>\xe7\xde\x88\xc8\xa2\x1e\xea\x85\x16 !$\x10\x88?\x05/t\x06\x95\xc8\xe2\x95\x06\xd0'

在图像上测试lenna.png(维基百科:Lenna

在此处输入图像描述


推荐阅读