web-dev-qa-db-ja.com

PhotoImageの下の画像のサイズ変更

画像のサイズを変更する必要がありますが、OS Xで機能させることができないため、PILは使用したくありません。理由を聞かないでください...

とにかく、私はgif/pgm/ppmで満足しているので、PhotoImageクラスは大丈夫です:

photoImg = PhotoImage(file=imgfn)
images.append(photoImg)
text.image_create(INSERT, image=photoImg)

問題は-画像のサイズを変更するにはどうすればよいですか?以下は、PIL以外で機能するPILでのみ機能しますか?

img = Image.open(imgfn)
img = img.resize((w,h), Image.ANTIALIAS)
photoImg = ImageTk.PhotoImage(img)
images.append(photoImg)
text.image_create(INSERT, image=photoImg) 

ありがとうございました!

17
alessandro

PhotoImageクラスのsubsample()またはzoom()メソッドを使用する必要があります。最初のオプションでは、最初にスケール係数を計算する必要があります。これは、次の行で簡単に説明されています。

scale_w = new_width/old_width
scale_h = new_height/old_height
photoImg.zoom(scale_w, scale_h)
10
Constantinius

zoom()subsample()はどちらもパラメーターとして整数が必要なので、両方を使用しました。

320x320の画像を250x250にサイズ変更する必要があり、

imgpath = '/path/to/img.png'
img = PhotoImage(file=imgpath)
img = img.zoom(25) #with 250, I ended up running out of memory
img = img.subsample(32) #mechanically, here it is adjusted to 32 instead of 320
panel = Label(root, image = img)
12
Memes

PILをインストールしていない場合->インストールする

(Python3 +ユーザーの場合-> cmdで「pip install pillow」を使用)

from tkinter import *
import tkinter
import tkinter.messagebox
from PIL import Image
from PIL import ImageTk

master = Tk()

def callback():
    print("click!")

width = 50
height = 50
img = Image.open("dir.png")
img = img.resize((width,height), Image.ANTIALIAS)
photoImg =  ImageTk.PhotoImage(img)
b = Button(master,image=photoImg, command=callback, width=50)
b.pack()
mainloop()
2
Vyr

私は同じ問題を抱えていましたが、@ Memesの回答はかなりうまくいくことがわかりました。 subsample()は、何らかの理由で実行にかなり長い時間がかかるため、比率をできるだけ低くするようにしてください。

基本的に、画像は2つのサイズの最小公倍数にズームアウトされ、その後、元のサイズによって補助されます。これにより、希望のサイズのイメージが残ります。

1
Patrick