python-3.x - Python:如何将图像转换为字符串并返回?
问题描述
我将这样的图像加载到PIL.Image
:
现在我想把它变成一个python字符串,它不应该是二进制的,我该怎么做?因为当我尝试编码时,出现以下错误:
我的代码:
from PIL import Image
img = Image.open("testImage.jpeg")
string = img.tobytes()
string = string.decode("ascii")
输出:
Traceback (most recent call last):
File "/Users/tomschimansky/Desktop/SenderMAIN.py", line 5, in <module>
string = string.decode("ascii")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
当这可行时,我还想将字符串转回图像。
其他对我也不起作用的方法:
- 直接从文件中读取图像
open("file","rb")
,然后对其进行编码。 codecs
用库对其进行编码。(string = codecs.encode(string, "base64"
))- 使用库对其进行编码
base64
(能够将其转换为字符串,但字符串看起来像这样:///////
.(只有斜杠))
感谢您的回答!
解决方案
您可以像这样转换为字符串:
import base64
with open("image.png", "rb") as image:
b64string = base64.b64encode(image.read())
这应该会给您与在终端中运行相同的结果:
base64 < image.png
您可以将该字符串转换回 PIL 图像,如下所示:
from PIL import Image
import io
f = io.BytesIO(base64.b64decode(b64string))
pilimage = Image.open(f)
这应该等同于终端中的以下内容:
base64 -D < "STRING" > recoveredimage.png
请注意,如果您通过 LoRa 发送此文件,则最好像我在这里一样发送文件的 PNG 编码版本,因为它是压缩的并且需要更少的时间。或者,您可以发送文件的扩展内存版本,但这会大将近 50%。PNG文件为13kB。扩展的内存版本将为 100*60*3,即 18kB。
推荐阅读
- extjs - 无法在 ext js 6.7 中创建控制器的对象
- image - 如何在本机反应中基于数组内的图像uri渲染图像组件
- plc - TwinCAT3:在隔离内核上运行失败
- oracle - oracle 12c 中的 IMP 不会创建具有 IDENTITY 功能的表
- javascript - 如何在单击输入框而不是图标或箭头时打开 Datepicker 对话框
- flutter - 如何实现一个拱形appBar
- python - 尽管在 anaconda.org 上找不到 Conda rst2pdf
- php - 是否有任何内置的 PHP 函数来替换德语“Umlaute”?
- python-3.x - 请求 url 必须是 str 或 unicode,得到 %s:' % type(url).__name__
- types - 跨类型共享功能