Кодирование файла изображения с помощью 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


что я делаю не так?

605   4  

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

    Ничего не найдено.