2017-02-12 14 views
1

Я пытаюсь создать редактор изображений, который добавляет текст в изображение с помощью подушки. Моя проблема заключается в сохранении моего отредактированного изображения, чтобы пользователь мог выбрать имя файла сохранения, открыв диалог сохранения. Глядя на другие вопросы и ответы, я пришел с этим:Как «сохранить как» отредактированное изображение (png) с помощью диалогового окна файла в tkinter и Pil в Python

def onOpen(self): 
     im = Image.open(askopenfilename()) 
     caption = simpledialog.askstring("Label", "What would you like the label on your picture to say?") 
     fontsize = 15 
     if im.mode != "RGB": 
      im = im.convert("RGB") 

     draw = ImageDraw.Draw(im) 
     font = ImageFont.truetype("arial.ttf", fontsize) 

     draw.text((0, 0),str(caption),(255,0,0),font=font) 

     file = filedialog.asksaveasfile(mode='w', defaultextension=".png") 
     if file: 
      file.write(im) 
      file.close() 

Однако, я получаю следующее сообщение об ошибке при запуске его:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\Renee\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "C:\Users\Renee\AppData\Local\Programs\Python\Python35-32\tkinterguitest.py", line 52, in onOpen 
    file.write(im) 
TypeError: write() argument must be str, not Image 

Я знаю, что вопрос заключается в том, что запись может быть использована только с строки, так есть ли команда, например file.write, но для изображений? Спасибо!

ответ

1

Вы должны сохранить изображение с помощью метода сохранения, что в объекте Image:

file = filedialog.asksaveasfile(mode='w', defaultextension=".png") 
if file: 
    im.save(file) # saves the image to the input file name. 
+0

Спасибо за помощь! к сожалению, я все еще получаю сообщение об ошибке. Это ошибка: 'TypeError: write() аргумент должен быть str, а не байтами', что является странным, так как я удалил аргумент записи – Renee

+0

, в частности, он говорит, что ошибка указана в строке 39, в' onOpen im = Image.open (askopenfilename()) 'и' строка 52, в onOpen im.save (файл) # сохраняет изображение во входное имя файла. ' – Renee

+0

Я только понял, что проблема в этой строке:' file = filedialog.asksaveasfile (mode = 'w', defaultextension = ".png", filetypes = (("PNG-файл", "* .png"), ("Все файлы", "*. *"))) 'если я открою его с помощью wb вместо w это сохраняет, но без текста, который я хотел бы на нем – Renee

1

я, наконец, понял это. Я закончил создание каждого компонента (изображение и текст) отдельно, а затем сохранил окончательное изображение в качестве составного. Вот окончательный код:

def onOpen(self): 
     im = Image.open(askopenfilename()) 
     caption = simpledialog.askstring("Label", "What would you like the label on your picture to say?") 
     fontsize = 30 
     if im.mode != "RGBA": 
      im = im.convert("RGBA") 
     txt = Image.new('RGBA', im.size, (255,255,255,0)) 

     draw = ImageDraw.Draw(txt) 
     font = ImageFont.truetype("arial.ttf", fontsize) 
     draw.text((0, 0),caption,(255,0,0),font=font) 



     file = filedialog.asksaveasfile(mode='w', defaultextension=".png", filetypes=(("PNG file", "*.png"),("All Files", "*.*"))) 
     if file: 
      abs_path = os.path.abspath(file.name) 
      out = Image.alpha_composite(im, txt) 
      out.save(abs_path) # saves the image to the input file name. 

 Смежные вопросы

  • Нет связанных вопросов^_^