質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

882閲覧

tkinterで、アニメーションの解像度を上げたい。

ppap

総合スコア68

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/09/01 14:18

前提

pythonで、クリックにより画像を回転させ、再度クリックすることで回転が止まるアニメーションを作成しています。
画像が回転している間、画像の縁 (直線部分) がモアレ柄のようになってしまいます。

改善方法を模索していますが、良い方法が見つからないためアドバイスをいただけたら幸いです。

実現したいこと

アニメーションの解像度を上げたいと考えています。
アニメーションの動きに直結するのは、"press_L"および"press_R"という名前のイベントです。

該当のソースコード

python

1#---SVV測定に使用する画像の作成--- 2 3from PIL import Image, ImageDraw 4 5#背景色が黒色のキャンパスを作成。 6im = Image.new('RGB', (500, 500), (0, 0, 0)) 7draw = ImageDraw.Draw(im) 8 9 10#中央に線を描画 11draw.line((50, 250, 450, 250), fill=(255, 255, 255), width=10) 12 13 14#同じサイズの画像を作成 15im_clear = Image.new("RGBA", im.size, (0, 0, 0, 0)) 16width = im.size[0] 17height = im.size[1] 18 19 20#色ごとに処理 21for x in range(width): 22 for y in range(height): 23 pixel = im.getpixel( (x, y) ) 24 25 # 黒なら処理しない 26 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 27 continue 28 29 # 黒以外なら、用意した画像にピクセルを書き込み 30 im_clear.putpixel( (x, y), pixel ) 31 32 33#SVVで表示させるバーをpng形式で保存 34im_clear.save("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png", quality=100) 35 36 37 38#---透明なpng画像の作成--- 39 40#画像サイズの指定 41WIDTH = 1500 42HEIGHT = 1000 43 44 45#新しい画像を作成 46im_snow = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 47 48 49#新しい画像をもう一つ作成 50im_snow2 = Image.new("RGBA", (WIDTH, HEIGHT), (0, 0, 0, 0)) 51 52 53#色ごとに処理 54for x in range(width): 55 for y in range(height): 56 pixel = im_snow2.getpixel( (x, y) ) 57 58 # 黒なら処理しない 59 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 60 continue 61 62 # 黒以外なら、用意した画像にピクセルを書き込み 63 im_snow.putpixel( (x, y), pixel ) 64 65 66#透明な画像をpng形式で保存 67im_snow.save("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png", quality=100) 68 69 70 71#---測定コード--- 72 73import tkinter as tk 74from PIL import Image, ImageTk 75 76 77#画面サイズの指定 78WIDTH = 1300 79HEIGHT = 800 80 81 82#新規ウィンドウを作成 83root = tk.Tk() 84root.title("SVV測定") 85root.attributes("-fullscreen", True) 86 87 88#ウィンドウ上にフレームを作成 89frame = tk.Frame(root) 90#frame = tk.Frame(root, width = root.winfo_screenwidth(), height = root.winfo_screenheight(), bg = "green") 91frame.pack() 92 93 94#フレーム上に、キャンバスを作成 95canvas = tk.Canvas(frame, width = WIDTH, height = HEIGHT, bg = "black") 96canvas.pack() 97 98 99#画像のプリセット角を"cs"として定義 100cs = 0 101 102 103#キャンバスにSVV画像を貼り付け 104img = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png") 105img = img.rotate(cs) 106tkimg = ImageTk.PhotoImage(img, width = WIDTH, height = HEIGHT) 107canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 108 109 110#キャンバスに、透明な画像を貼り付け 111img_snow = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_snow.png") 112tkimg_snow = ImageTk.PhotoImage(img_snow, width = WIDTH, height = HEIGHT) 113canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor="center", tags="img_snow") 114 115 116#"c"の初期値を定義 117c = 0 118 119 120#イベントが発生したときの処理 121def press_L(event): 122 #左クリックの回数によって、左回転させる 123 global img 124 global tkimg 125 global c 126 c = c + 0.1 127 IMG = img.rotate(c) 128 tkimg = ImageTk.PhotoImage(IMG) 129 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 130 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 131 id = root.after(1, press_L, None) 132 def stop_L(event): 133 #左クリックで、左回転をストップする 134 root.after_cancel(id) 135 canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 136 canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 137 def stop_L_by_R(event): 138 #右クリックでも、左回転をストップする 139 root.after_cancel(id) 140 canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 141 canvas.tag_bind("img_snow", "<ButtonPress-1>", stop_L) 142 canvas.tag_bind("img_snow", "<ButtonPress-3>", stop_L_by_R) 143 144 145def press_R(event): 146 #右クリックの回数によって、右回転させる 147 global img 148 global tkimg 149 global c 150 c = c - 0.1 151 IMG = img.rotate(c) 152 tkimg = ImageTk.PhotoImage(IMG) 153 canvas.create_image(WIDTH/2, HEIGHT/2, image = tkimg, anchor = "center", tags = "img") 154 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg_snow, anchor = "center", tags="img_snow") 155 id = root.after(1, press_R, None) 156 def stop_R(event): 157 #右クリックで、右回転をストップする 158 root.after_cancel(id) 159 canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 160 canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 161 def stop_R_by_L(event): 162 #左クリックでも、右回転をストップする 163 root.after_cancel(id) 164 canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 165 canvas.tag_bind("img_snow", "<ButtonPress-3>", stop_R) 166 canvas.tag_bind("img_snow", "<ButtonPress-1>", stop_R_by_L) 167 168 169def finish(event): 170 #Enterキーを押すことで全画面表示を終了し、回転角度を取得する 171 root.destroy() 172 print(-c) 173 174 175#左クリックで呼び出すイベント 176canvas.tag_bind("img_snow", "<ButtonPress-1>", press_L) 177 178 179#右クリックで呼び出すイベント 180canvas.tag_bind("img_snow", "<ButtonPress-3>", press_R) 181 182 183#Enterキーで呼び出すイベント 184root.bind("<Return>", finish) 185 186 187#メインループ 188root.mainloop() 189

試したこと

最初に作成する画像の縁をあらかじめ少しぼかしておく方法などを試しましたが、ぼかさずに回転させないと使用目的にマッチしませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jbpb0

2022/09/01 15:00

「img.rotate()」で「resample」を指定したら、見え方が変わりませんでしょうか? 参考 https://note.nkmk.me/python-pillow-rotate/ の「リサンプリングフィルター: 引数resample」
ppap

2022/09/01 15:18

解像度が良くなり、解決しました。 難しいことばかり考えて、調べたら分かるものを見落としていました。 URLまで添えて教えてくださり、本当にありがとうございます。 「resample」で解決したので、お手数ですが回答欄に同様の投稿をいただけないでしょうか? ベストアンサーに選択し、この質問を解決済みにできればと思います。
guest

回答2

0

ベストアンサー

「img.rotate()」で「resample」を指定してみてください

参考
Python, Pillowで画像を回転するrotate
の「リサンプリングフィルター: 引数resample」

投稿2022/09/02 00:11

jbpb0

総合スコア7651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppap

2022/09/02 01:05

ありがとうございます。
guest

0

create_image は新たな図形を作ります。以前にcreate_imageした図形をdeleteしないとメモリをどんどん消費して重たくなりますよ。
事前に state='hidden' ですべて create_imageしておいて、表示したいイメージだけ state='normal' に設定変更するようにすると改善するかもしれません。

線のモアレ(ギザギザ?)ならアンチエイリアス処理をすればいいかもしれません。方法はわかりませんけど。
それと、テレビ放送でも1秒間に30コマ(33ミリ秒/コマ)、ゲームで秒60コマ(16ミリ秒/コマ)や120コマ(8ミリ秒/コマ)の描画でアニメーションしています。
afterで1ミリ秒毎に描画していたら、描画が追い付かなくてチラつく原因になっていると思いますよ。

投稿2022/09/01 17:04

編集2022/09/01 17:18
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ppap

2022/09/02 01:08

アドバイスをありがとうございます。 state='hidden' の方法、試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問