我想使用base64模块将图像编码为字符串。不过我遇到了一个问题。如何指定我想要编码的图像?我尝试将目录用于图像,但这只会导致目录被编码。我希望对实际的图像文件进行编码。
EDIT
我试了一下这个片段:
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))
但是我得到了以下错误:
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
我做错了什么?
正如我在你之前的问题中所说,没有必要对字符串进行base64编码,这只会使程序变慢。使用repr即可
>>> 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))
...
现在图像作为一个名为image_data的变量存储在一个名为image.py的文件中
启动一个新的解释器并导入image_data
>>> from image import image_data
>>>
借鉴Ivo van der Wijk和gnibbler早期开发的方法,这是一种动态解决方案
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编译输出图像文件,使其更酷。使用此方法,您可以将所有图形捆绑到一个模块中。
正如我在你之前的问题中所说,没有必要对字符串进行base64编码,这只会使程序变慢。使用repr即可
>>> 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))
...
现在图像作为一个名为image_data的变量存储在一个名为image.py的文件中
启动一个新的解释器并导入image_data
>>> from image import image_data
>>>