【发布时间】:2018-08-09 16:49:45
【问题描述】:
使用 base64 可以将文件转换为字符串,然后将字符串转换回新图像:
import base64
with open("first_image.png", "rb") as imageFile:
str = base64.b64encode(imageFile.read())
fh = open("second_image.png", "wb")
fh.write(base64.b64decode(str))
fh.close()
但是,使用上面编写的脚本,会创建图像的物理“副本”。相反,我需要将三个图像(已转换为字符串)保存为虚拟图像。这是因为这三个图像是在脚本加载过程中使用的,必须与其他图像分开。这样,如果脚本所需的文件(例如模块、图像等)丢失,这三个图像仍然存在。在这种情况下,三个图像是:“徽标”、“进度条”和“警告”。
那么,如何不将图像保存为物理文件,而是保存为可用作普通文件的虚拟文件?
编辑:
我环顾了一下,我设法为我的脚本创建了这个类:
ico_16 = here is the string for the image
pyglet.image.load(__temporary__(ico_16, "ico_16", ".png"))
class __temporary__():
def __init__(self, str, px, sx):
self.__ip__ = str
self.__px__ = px
self.__sx__ = sx
self.__temp__()
def __temp__(self):
with tempfile.SpooledTemporaryFile(max_size=100000, mode="wb", prefix=self.__px__,
suffix=self.__sx__) as __op__:
__op__.write(base64.b64decode(self.__ip__))
__op__.seek(0)
return __op__
我正在使用 Pyglet,但我的问题对于最终使用的任何类型的模块都有效。例如,在 Pyglet 中,图像以以下方式打开:
file = open(filename, 'rb')
问题是我必须给它一个名字而不是一个文件,所以我不知道如何解决它。
事实上,当我尝试启动脚本时,我得到了错误:
Traceback (most recent call last):
File "F:/Python/Project/PEDPD/main.py", line 153, in <module>
window = PyEngine()
File "F:/Python/Project/PEDPD/main.py", line 37, in __init__
self.__icon_16__ = pyglet.image.load(__temporary__(ico_16, "ico_16", ".png"))
File "F:\Python\Python34\lib\site-packages\pyglet\image\__init__.py", line 180, in load
file = open(filename, 'rb')
TypeError: invalid file: <__main__.__temporary__ object at 0x00000000159D3128>
我试图打开 Tempfile 模块(因为该模块的指南并没有提供太多有用的信息,至少在我看来)。不幸的是,在我看来,我没有注意到任何可以帮助我的东西。
【问题讨论】:
-
虚拟文件是什么意思?你想要一个内存中的 IO 句柄吗?
-
在实践中,我希望将文件保存在计算机的虚拟内存中,而不是将文件保存在计算机的内存中。我不能很好地解释。在我看来,例如“StringIo”模块将字符串保存在虚拟内存中。我想做同样的事情,但使用三张图片。
-
内存是 RAM。这就是我所说的拥有内存 IO 句柄的意思。您所说的内存通常称为存储/磁盘。你能说明你将如何使用这些手柄吗?
-
什么意思?
-
你只是想用它们来伪造二进制 IO 缓冲区,即好像来自
open("first_image.png", "rb")的返回值。
标签: python python-3.x base64 temporary-files pyglet