【发布时间】:2018-06-25 01:45:07
【问题描述】:
我有一个 RGB 数据列表:
cdata=[R1, G1, B1, R2, G2, B2,..., Rn, Gn, Bn]
每个值都包含在 0 到 255 之间。
我正在尝试使用 Pillow 5.0.0 将此数组重建为图像。 在 Python 2 下,我能够以这种方式将值列表转换为字节字符串:
cdata2 = []
gidx = len(cdata)//3
bidx = len(cdata)//3*2
for i in range(len(cdata)//3):
cdata2.append(cdata[i])
cdata2.append(cdata[i+gidx])
cdata2.append(cdata[i+bidx])
data = ""
for c in cdata2:
data += chr(c)
im = Image.frombytes("RGB", (420, 560), data)
然后在 base64 中重新编码“im”并在 HTML 模板中将其显示为 PNG。
不幸的是,这在 Python 3 中不起作用,我遇到如下错误:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 42099-42101: character maps to <undefined>
此外,Pillow 5 文档现在建议使用
im = Image.open(StringIO(data))
但不能使它与上面构建的字符串一起使用。有没有更聪明的方法来做到这一点?非常感谢您的帮助。
【问题讨论】:
-
在 Python 3 中,纯字符串用于 (Unicode) 文本,不要尝试将它们用于二进制数据。相反,您应该使用
bytearray,或者可能是bytes对象。 Numpy 是您的选择吗?为什么你的 RGB 值的范围是 0-254 而不是 0-255? -
谢谢 PM 2Ring。是的,它们确实高达 255,将纠正这一点。我可以使用 Numpy。请问如何对 RGB 通道数据进行编码,然后将其与 Pillow 一起使用?
标签: python image python-imaging-library pillow stringio