Кодировать и декодировать .gif файл, который будет использоваться с pyglet и превращаться в .exe с pyinstaller

79
7

Я хочу испечь файл .gif в .exe с помощью pyinstaller. Из моего исследования я должен закодировать gif в строку и декодировать эту строку, чтобы это было возможно. Кодирование строки и декодирование строки работает. Я получаю сообщение об ошибке при попытке использовать его в качестве ресурса анимации в Pyglet. Что-то в кодировке-декодировании сломало гифку? Если есть другой предпочтительный способ сделать это, пожалуйста, дайте мне знать!

Шаг 1

import base64

with open("test.gif", "rb") as imageFile:
image = base64.b64encode(imageFile.read())
print(image)

Шаг 2

Сохранение этой строки в файле .py, например:

image = b'AWggsegsegs/....'

Шаг 3

import pyglet
import base64
from gif_string import image

decodedgif = base64.b64decode(image) # Works this far
animation = pyglet.resource.animation(decodedgif) # Error here
sprite = pyglet.sprite.Sprite(decodedgif)

Сообщение об ошибке читает

Traceback (most recent call last):
File "...pyglet\resource.py", line 583, in animation
identity = self._cached_animations[name]
File "...AppData\Local\Programs\Python\Python36\lib\weakref.py", line 131, in __getitem__
o = self.data[key]()
KeyError: b'GIF89a
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "...\pyglet\resource.py", line 435, in file
location = self._index[name]
KeyError: b'GIF89a\
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\..., line 7, in <module>
animation = pyglet.resource.animation(decodedgif) # Error here
File "...\pyglet\resource.py", line 585, in animation
animation = pyglet.image.load_animation(name, self.file(name))
File "...\pyglet\resource.py", line 438, in file
raise ResourceNotFoundException(name)
pyglet.resource.ResourceNotFoundException: Resource "b'GIF89a\x00\
...
...f9\x88\xc0\xbe\xa4O"o\xcf\xe5\x81\x00\x00;'" was not found on the path.
Ensure that the filename has the correct captialisation.

спросил(а) 2021-01-19T16:27:14+03:00 8 месяцев назад
1
Решение
101

Вместо pyglet.resource.animation() который может загружать только файлы, вы должны использовать pyglet.image.load_animation(). Его необязательный параметр File поддерживает файловые объекты, поэтому вы должны io.BytesIO() с помощью io.BytesIO() и передать его туда.

ответил(а) 2021-01-19T16:27:14+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема