用Python转换图像

用Python转换图像,python,image,mqtt,Python,Image,Mqtt,我无法将图像转换为字节/字符串等。我可以将图像转换为字符串或字节数组,或者对其使用B64编码,但当我尝试将其解码/还原为图像时,它永远无法工作。我尝试了很多方法,在本地转换一个图像,然后重新转换它,用不同的名称保存它。但是,生成的文件实际上不会显示任何内容。(Linux为黑色,windows为“无法显示图像”) 我最基本的B64编码脚本如下: import base64 def convert(image): f = open(image) data = f.read()

我无法将图像转换为字节/字符串等。我可以将图像转换为字符串或字节数组,或者对其使用B64编码,但当我尝试将其解码/还原为图像时,它永远无法工作。我尝试了很多方法,在本地转换一个图像,然后重新转换它,用不同的名称保存它。但是,生成的文件实际上不会显示任何内容。(Linux为黑色,windows为“无法显示图像”)

我最基本的B64编码脚本如下:

import base64

def convert(image):
    f = open(image)
    data = f.read()
    f.close()
    string = base64.b64encode(data)
    convertit = base64.b64decode(string)

    t = open("Puppy2.jpg", "w+")
    t.write(convertit)
    t.close()


if __name__ == "__main__":
    convert("Puppy.jpg")
我已经在这上面呆了一段时间了。我相信这是一个简单的解决方案,但由于对Python还不熟悉,所以尝试解决问题有点困难。 如果它有助于任何洞察,那么这里的最终目标是通过网络(可能是MQTT)传输图像

非常感谢您的帮助。谢谢

编辑**这在Python 2.7中。
编辑2**哇,你们动作很快。这是一个多么棒的社区介绍-非常感谢您的快速响应和超快的结果

对于python3,您需要以二进制模式打开和写入:

def convert(image):
    f = open(image,"rb")
    data = f.read()
    f.close()
    string = base64.b64encode(data)
    convert = base64.b64decode(string)
    t = open("Puppy2.jpg", "wb")
    t.write(convert)
    t.close()
在linux上使用python 2,只要
r
w
就可以了。在windows上,您需要执行与上面相同的操作

从:

在Windows上,附加到模式的“b”以二进制模式打开文件,因此也有类似“rb”、“wb”和“r+b”的模式。Windows上的Python区分了文本文件和二进制文件;在读取或写入数据时,文本文件中的行尾字符会自动轻微更改。这种对文件数据的幕后修改对于ASCII文本文件来说很好,但它会破坏JPEG或EXE文件中的二进制数据。在读取和写入此类文件时,请非常小心地使用二进制模式。在Unix上,在模式中附加一个“b”并没有什么坏处,因此您可以在所有二进制文件中独立使用it平台

您还可以使用
with
打开文件,自动关闭文件,从而更简洁地编写代码:

from base64 import b64encode, b64decode

def convert(image):
    with open(image, "rb") as f, open("Puppy2.jpg", "wb") as t:
        conv = b64decode(b64encode(f.read()))
        t.write(conv)

修复缩进,因为当前代码甚至无法运行,同时调用一个变量和同名函数也不是一个好主意。将其用于修复缩进,只是没有正确复制。也改了那个名字。谢谢给函数和变量取相同的名称不是一个好主意<代码>转换在代码中。什么版本的python?必须指定打开图像的模式。请看@Padraic Cunningham->
f=open(图为“rb”)
谢谢!我在2.7中,但这解决了它。看起来它现在正在工作。耶!非常感谢@Aaron,你在用windows吗?是的,现在正在测试。但是现在已经解决了,我也将在Ubuntu上实现它。它应该可以在Ubuntu上很好地工作,用r和w打开,b只有在windows上才有意义。
import base64

def convert(image):
    f = open(image)
    data = f.read()
    f.close()
    return data

if __name__ == "__main__":
    data = convert("Puppy2.jpg")
    string = base64.b64encode(data)
    convert = base64.b64decode(string)

    t = open("Puppy2.jpg", "w+")
    t.write(convert)
    t.close()