前提・実現したいこと
Pythonのtkinterでバイナリ文字列から画像ファイルとして保存せずに,そのまま表示させたく,試験的にコードを書いていたところ画像データまでは作成できるものの,そのまま表示させることができません.
得られたバイナリ文字列(contents)から画像ファイルとして保存することはでき,その画像ファイルを指定すればキャンバスに出力もできたのでデータ自体は問題ないかと思うのですが...
保存せずにそのままキャンバスに出力できないものでしょうか?
これが出来次第,バイナリ文字列をtxtファイルなどに保存して読み込むことで画像出力をしようと考えています.
発生している問題・エラーメッセージ
image "<PIL.PngImagePlugin.PngImageFile image mode=RGB size=438x774 at 0x16D474C8888>" doesn't exist
該当のソースコード
Python
1import tkinter as tk 2from PIL import Image, ImageTk 3import io 4 5win = tk.Tk() 6win.resizable(False,False) 7cvs = tk.Canvas(width=900, height=900) 8cvs.pack() 9 10origin = Image.open("test.png") 11origin.save(io.BytesIO(), format="PNG") 12with io.BytesIO() as output: 13 origin.save(output, format="PNG") 14 contents = output.getvalue() 15print("contents={}".format(contents))#バイナリ文字列確認用 16testimg=Image.open(io.BytesIO(contents)) 17 18cvs.create_image(0,0,image=testimg,tag="mytest") 19 20win.mainloop()
試したこと
一度PhotoImageを用いないといけないかと思い,
import tkinter as tk from PIL import Image, ImageTk import io win = tk.Tk() win.resizable(False,False) cvs = tk.Canvas(width=900, height=900) cvs.pack() origin = Image.open("test.png") origin.save(io.BytesIO(), format="PNG") with io.BytesIO() as output: origin.save(output, format="PNG") contents = output.getvalue() print("contents={}".format(contents)) testimg=Image.open(io.BytesIO(contents)) img = tk.PhotoImage(data=testimg) cvs.create_image(450,450,image=img,tag="mytest") win.mainloop()
としてみましたが18行目img=で"couldn't recognize image data"と言われました.
補足情報(FW/ツールのバージョンなど)
Python3.7
Windows10
画像データをバイナリ文字列に変換する記述はhttps://cream-worker.blog.jp/archives/1073793999.htmlを参考にさせて頂きました.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/21 15:07