python - 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' '"
。我该如何处理?
解决方案
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)
推荐阅读
- javascript - 使用 Promise 时在哪里插入占位符函数?
- python - Facebook 公共数据抓取
- powershell - 我想从 Powershell 中的变量中获取 1 行
- java - JavaSwing 向 JFrame 添加多个 JTable
- json - 获取根键的json路径表达式
- python - 有没有办法在 Python 中进行并行分析?
- python - 为什么我收到文本到语音的错误?
- wordpress - 如何在functions.php中使用phpmailer
- delphi - 使用存储在 Microsoft 商店中的证书对文件进行签名
- discord.js - 我无法通过discord js获取作者的头像