Кодирование файла изображения с помощью base64
Я хочу закодировать изображение в строку с помощью модуля base64. Я столкнулся с проблемой. Как указать изображение, которое я хочу закодировать? Я попытался использовать каталог для изображения, но это просто приводит к кодированию каталога. Я хочу, чтобы фактический файл изображения был закодирован.
EDIT
Я устал этот фрагмент:
with open("C:Python26seriph1.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:Python26GUI1.2.9.py", line 473, in <module>
app = simpleapp_tk(None)
File "C:Python26GUI1.2.9.py", line 14, in __init__
self.initialize()
File "C:Python26GUI1.2.9.py", line 431, in initialize
self.image = ImageTk.PhotoImage(Image.open(UUU))
File "C:Python26libsite-packagesPILImage.py", line 1952, in open
fp = __builtin__.open(fp, "rb")
TypeError: file() argument 1 must be encoded string without NULL bytes, not str
что я делаю не так?
4 ответов:
Я не уверен, что понимаю ваш вопрос. Я предполагаю, что вы делаете что-то вроде:
import base64 with open("yourfile.ext", "rb") as image_file: encoded_string = base64.b64encode(image_file.read())вы должны сначала открыть файл и прочитать его содержимое - вы не можете просто передать путь к функции кодирования.
Edit: Хорошо, вот обновление после редактирования исходного вопроса.
прежде всего, не забудьте использовать необработанные строки (префикс строки с 'r') при использовании разделителей пути в Windows, чтобы предотвратить случайно попав в побег персонажа. Во-вторых, образ пила.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()
С python 2.x, вы можете тривиально кодировать с помощью .кодировать:
with open("path/to/file.png", "rb") as f: data = f.read() print data.encode("base64")
как я уже сказал в вашем предыдущем вопросе, нет необходимости в 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 >>>
заимствование из того, что Иво ван дер Вийк и 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 чтобы было круто. С помощью этого метода вы можете объединить всю свою графику в один модуль.
Comments