Encoding an image file with base64
我想使用base64模块将图像编码为字符串。不过,我遇到了一个问题。如何指定要编码的图像?我尝试将目录用于图像,但这只会导致对目录进行编码。我希望对实际图像文件进行编码。
编辑
我试过这个片段:
1 2 3 4 5 6 7 8 | with open("C:\Python26\seriph1.BMP","rb") as f: data12 = f.read() UU = data12.encode("base64") UUU = base64.b64decode(UU) print UUU self.image = ImageTk.PhotoImage(Image.open(UUU)) |
但我得到以下错误:
1 2 3 4 5 6 7 8 9 10 11 | Traceback (most recent call last): File"<string>", line 245, in run_nodebug File"C:\Python26\GUI1.2.9.py", line 473, in <module> app = simpleapp_tk(None) File"C:\Python26\GUI1.2.9.py", line 14, in __init__ self.initialize() File"C:\Python26\GUI1.2.9.py", line 431, in initialize self.image = ImageTk.PhotoImage(Image.open(UUU)) File"C:\Python26\lib\site-packages\PIL\Image.py", line 1952, in open fp = __builtin__.open(fp,"rb") TypeError: file() argument 1 must be encoded string without NULL bytes, not str |
我做错什么了?
我不确定我理解你的问题。我假设你是在做以下事情:
1 2 3 4 | import base64 with open("yourfile.ext","rb") as image_file: encoded_string = base64.b64encode(image_file.read()) |
当然,您必须先打开文件并读取其内容—您不能简单地将路径传递给encode函数。
编辑:好的,这是编辑原始问题后的更新。
首先,在Windows上使用路径分隔符时,请记住使用原始字符串(在字符串前面加上"r"),以防止意外碰到转义字符。其次,pil的image.open要么接受文件名,要么接受类似文件的文件(即,对象必须提供read、seek和tell方法)。
也就是说,您可以使用cstringio从内存缓冲区创建这样的对象:
1 2 3 4 5 6 7 8 | import cStringIO import PIL.Image # assume data contains your decoded image file_like = cStringIO.StringIO(data) img = PIL.Image.open(file_like) img.show() |
使用python 2.x,您可以使用.encode进行琐碎的编码:
1 2 3 | with open("path/to/file.png","rb") as f: data = f.read() print data.encode("base64") |
正如我在前面的问题中所说,不需要对字符串进行base64编码,它只会使程序变慢。就用那个代表
1 2 3 4 5 6 | >>> with open("images/image.gif","rb") as fin: ... image_data=fin.read() ... >>> with open("image.py","wb") as fout: ... fout.write("image_data="+repr(image_data)) ... |
现在图像作为一个名为
1 2 | >>> from image import image_data >>> |
借鉴了伊沃·范德·威克和格尼布尔早先的发展,这是一个动态的解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import cStringIO import PIL.Image image_data = None def imagetopy(image, output_file): with open(image, 'rb') as fin: image_data = fin.read() with open(output_file, 'w') as fout: fout.write('image_data = '+ repr(image_data)) def pytoimage(pyfile): pymodule = __import__(pyfile) img = PIL.Image.open(cStringIO.StringIO(pymodule.image_data)) img.show() if __name__ == '__main__': imagetopy('spot.png', 'wishes.py') pytoimage('wishes') |
然后,您可以决定使用Cython编译输出图像文件以使其冷却。使用此方法,您可以将所有图形捆绑到一个模块中。
第一个答案将打印前缀为b'的字符串。这意味着您的字符串将类似于"您的字符串"来解决这个问题,请添加以下代码行。
1 2 | encoded_string= base64.b64encode(img_file.read()) print(encoded_string.decode('utf-8')) |