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

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

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

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

Python

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

Q&A

解決済

1回答

1329閲覧

tkinterで画質を保ちながら画像を回転したい。

ppap

総合スコア68

Anaconda

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

Python

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

0グッド

0クリップ

投稿2022/08/17 07:04

前提

Pythonでpillowとtkinterを用い、画面クリックで画像が回転するコードを作成しています。
実行したい動作そのものはできていますが、動作が進むにすれて画質が悪くなってしまいます。

実現したいこと

画面クリックで画像を回転させた際、画質を保ちたいと考えています。
添付のコードは10degごとに回転させていますが、
コードをブラッシュアップしていくなかで、
0.0001degごとに回転させるつもりです。

細かい角度設定にも耐えうる、「画質の低下を防ぐアイデア」をいただけないでしょうか。

発生している問題・エラーメッセージ

特にありません。

該当のソースコード

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#中央に線を描画 10draw.line((50, 250, 450, 250), fill=(255, 255, 255), width=10) 11 12#同じサイズの画像を作成 13im_clear = Image.new("RGBA", im.size, (0, 0, 0, 0)) 14width = im.size[0] 15height = im.size[1] 16 17for x in range(width): 18 for y in range(height): 19 pixel = im.getpixel( (x, y) ) 20 21 # 黒なら処理しない 22 if pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0: 23 continue 24 25 # 黒以外なら、用意した画像にピクセルを書き込み 26 im_clear.putpixel( (x, y), pixel ) 27 28#SVVで表示させるバーをpng形式で保存 29im_clear.save("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png", quality=100) 30 31 32#---測定コード--- 33 34import tkinter as tk 35from PIL import Image, ImageTk 36 37 38#画面サイズの指定 39WIDTH = 1300 40HEIGHT = 800 41 42#新規ウィンドウを作成 43root = tk.Tk() 44canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT, bg="black") 45canvas.pack() 46 47#ウィンドウにSVV画像を貼り付け 48img = Image.open("D:\EXPERIMENT\programming\Python\SVV\svv_bar.png") 49img = img.rotate(0) 50tkimg = ImageTk.PhotoImage(img, width=WIDTH, height=HEIGHT) 51canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 52 53#イベントが発生したときの処理 54def press_L(event): 55 #左クリックで、画像を左回転させる 56 global img 57 global tkimg 58 img = img.rotate(10) 59 tkimg = ImageTk.PhotoImage(img) 60 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 61 62def press_R(event): 63 #右クリックで、画像を右回転させる 64 global img 65 global tkimg 66 img = img.rotate(-10) 67 tkimg = ImageTk.PhotoImage(img) 68 canvas.create_image(WIDTH/2, HEIGHT/2, image=tkimg, anchor="center", tags="img") 69 70#左クリックで呼び出すイベント 71canvas.tag_bind("img", "<ButtonPress-1>", press_L) 72 73#右クリックで呼び出すイベント 74canvas.tag_bind("img", "<ButtonPress-3>", press_R) 75 76#メインループ 77root.mainloop()

試したこと

回転角度を40degより小さく設定するにつれて、画像の乱れが増加します。

補足情報(FW/ツールのバージョンなど)

Anacondaを用いてPythonを使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

画像を回転変換すると「必ず」劣化します。 なので、回転したものを回転するという方法を取ると大きく劣化することになります。

元の画像を保持しておいて、常にそれを必要な角度分回転させる処理をするのはどうでしょうか。

投稿2022/08/17 07:16

TakaiY

総合スコア12765

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

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

ppap

2022/08/17 07:44

劣化を避ける方法はないのですね。 ありがとうございます。 頂いたアドバイスのように、元の画像を保持しておいて回転させるコードにしてみようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問