我想将PIL.ImageTk.PhotoImage保存到文件中。我的方法是创建一个“打开”文件并调用“写”方法,但它不起作用,因为我不知道如何从对象中获取字节数组。
def store_temp_image(data, image):
new_file_name = data.number + ".jpg"
with open(os.path.join("/tmp/myapp", new_file_name), mode='wb+') as output:
output.write(image)
错误消息如下:
TypeError: a bytes-like object is required, not 'PhotoImage'
我通常会找到将ImageTk对象转换为PIL对象的方法,但不是相反。从文档中我也无法获得任何提示。
答案 0 :(得分:0)
看看这个......
http://pillow.readthedocs.io/en/3.1.x/reference/ImageTk.html#PIL.ImageTk.PhotoImage
从那里你可以获得包含的Image对象。其中有save(...)
方法可以完成您期望的工作。
http://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.save
因此,这个(未经测试的)代码应该完成这项工作:
def store_temp_image(data, image):
new_file_name = data.number + ".jpg"
new_file_path = os.path.join('/tmp/myapp', new_file_name)
image.image.save(new_file_path)
希望这有帮助!
答案 1 :(得分:0)
查看the source code for the ImageTk module,您可以看到它实际上创建了一个tkinter.PhotoImage对象并将其存储为__photo。
self.__photo = tkinter.PhotoImage(**kw)
此属性可作为_PhotoImage__photo
访问(由于前导__
,it's name has been mangled)。
然后,要保存图像,请you can do:
image._PhotoImage__photo.write("/tmp/myapp"+new_file_name)
请注意,这仅支持非常有限的文件格式选择。它适用于png文件,gif文件和ppm文件,但不适用于jpg文件。
答案 2 :(得分:0)
可以先使用ImageTk.getimage()函数(向下滚动,接近尾声)得到一个PIL Image,然后使用它的save()方法:
def store_temp_image(data, imagetk):
# do sanity/validation checks here, if need be
new_file_name = data.number + ".jpg"
imgpil = ImageTk.getimage( imagetk )
imgpil.save( os.path.join("/tmp/myapp", new_file_name), "JPEG" )
imgpil.close() # just in case (not sure if save() also closes imgpil)