2017-02-12 6 views
1

枕を使用して画像にテキストを追加する画像エディタを作成しようとしています。私の問題は、編集した画像を保存して、ユーザーが保存ダイアログを開くことで保存ファイルの名前を選択できるようにすることです。他の質問と回答を見ると、私はこの思い付いた:tkinterとPythonのPilのファイルダイアログを使用して編集した画像(png)を保存する方法

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()引数は、書き込み引数を取り除いたので、奇妙なバイトではありません.' – Renee

+0

特に、エラーは' onOpenで39行目です。 im = Image.open (askopenfilename()) 'と' line 52、onOpen im.save(file)#は画像を入力ファイル名に保存します。 ' – Renee

+0

問題がこの行にあることを知りました: 'file = filedialog.asksaveasfile私がwbで開くと、mode = 'w'、defaultextension = ".png"、filetypes =(( "PNGファイル"、 "* .png")、( "All Files"、 "*。*"))) ' 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. 
関連する問題