Python:如何将图像转换为字符串并再次转换回来?

14

我有一张像这样的图片,已经加载到了PIL.Image中:

enter image description here

现在我想把它转化为一个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库进行编码(能够将其转换为字符串,但该字符串看起来像这样:///////。(只有斜杠)

感谢您的答案!

1个回答

14

您可以像这样将其转换为字符串:

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。

但是类型是<bytes>,我无法将字节传递给LoRa sender.c程序。或者您有LoRa的经验吗? - Tom
1
你可以在末尾添加.decode('ASCII'),将字节转换为字符串。 - Mark Setchell
1
非常感谢您的回答,这对我帮助很大。现在它已经可以正常工作了。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接