问题:使用base64编码图像文件
我想使用base64模块将图像编码为字符串。不过我遇到了一个问题。如何指定要编码的图像?我尝试对图像使用目录,但这只会导致目录被编码。我希望对实际的图像文件进行编码。
编辑
我尝试了以下代码段:
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
我究竟做错了什么?
回答 0
我不确定我是否理解您的问题。我假设您正在按照以下方式进行操作:
import base64
with open("yourfile.ext", "rb") as image_file:
encoded_string = base64.b64encode(image_file.read())
当然,您必须首先打开文件并读取其内容-您不能简单地将路径传递给encode函数。
编辑: 好的,在您编辑完原始问题之后,这是一个更新。
首先,在Windows上使用路径定界符时,请记住使用原始字符串(在字符串前加上’r’),以防止意外击中转义字符。其次,PIL的Image.open要么接受文件名,要么接受类似文件的文件(也就是说,该对象必须提供读取,查找和告诉方法)。
话虽如此,您可以使用cStringIO从内存缓冲区创建这样的对象:
import cStringIO
import PIL.Image
# assume data contains your decoded image
file_like = cStringIO.StringIO(data)
img = PIL.Image.open(file_like)
img.show()
回答 1
使用python 2.x,您可以使用.encode进行简单编码:
with open("path/to/file.png", "rb") as f:
data = f.read()
print data.encode("base64")
回答 2
第一个答案将打印带有前缀b’的字符串。这意味着您的字符串将如下所示:b’your_string’要解决此问题,请添加以下代码行。
encoded_string= base64.b64encode(img_file.read())
print(encoded_string.decode('utf-8'))
回答 3
正如我在上一个问题中所说的那样,无需对字符串进行base64编码,只会使程序变慢。只需使用代表
>>> 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
>>>
回答 4
借鉴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编译输出图像文件,以使其更酷。使用这种方法,您可以将所有图形捆绑到一个模块中。
回答 5
import base64
from PIL import Image
from io import BytesIO
with open("image.jpg", "rb") as image_file:
data = base64.b64encode(image_file.read())
im = Image.open(BytesIO(base64.b64decode(data)))
im.save('image1.png', 'PNG')
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。