Jpeg Image : zlib.error : Error -3 while decompressing data : incorrect header check

Jpeg Image : zlib.error : Error -3 while decompressing data : incorrect header check

我在内存中有一个 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' '"。我该如何处理?

str() 用于显示某些内容 - 它创建人类可读的文本。

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

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

如果您必须将文件作为字符串保存(或通过互联网发送),那么最好将其转换为 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