Search code examples
pythontkinterzoomingphotoimage

PhotoImage zoom


I'm trying to zoom in on an image and display it with the following code

import tkinter as tk
from PIL import Image as PIL_image, ImageTk as PIL_imagetk

window = tk.Tk()

img1 = PIL_imagetk.PhotoImage(file="C:\\Two.jpg")
img1 = img1.zoom(2)

window.mainloop()

But python says AttributeError: 'PhotoImage' object has no attribute 'zoom'. There is a comment on a related post here: Image resize under PhotoImage which says "PIL's PhotoImage does not implement zoom from Tkinter's PhotoImage (as well as some other methods)".

I think this means that I need to import something else into my code, but I'm not sure what. Any help would be great!


Solution

  • img1 has no method zoom, however img1._PhotoImage__photo does. So just change your code to:

    import tkinter as tk
    from PIL import Image as PIL_image, ImageTk as PIL_imagetk
    
    window = tk.Tk()
    
    img1 = PIL_imagetk.PhotoImage(file="C:\\Two.jpg")
    img1 = img1._PhotoImage__photo.zoom(2)
    
    label =  tk.Label(window, image=img1)
    label.pack()
    
    window.mainloop()
    

    By the way if you want to reduce the image you can use the method subsample img1 = img1._PhotoImage__photo.subsample(2) reduces the picture by half.

    If you have a PIL Image, then you can use resize like following example:

    import tkinter as tk
    from PIL import Image, ImageTk
    
    window = tk.Tk()
    
    image = Image.open('C:\\Two.jpg')
    image = image.resize((200, 200), Image.ANTIALIAS)
    img1 = ImageTk.PhotoImage(image=image)
    
    label = tk.Label(window, image=img1)
    label.pack()
    
    window.mainloop()
    

    Note I just import Image and ImageTk, see no need to rename to PIL_image and PIL_imagetk, which to me is only confusing