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)
我在内存中有一个 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)