Problem z zapisem zdjęcia po resize

0

Mam kod:

from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog

root=Tk()
root.title("Upload")
root.geometry("900x700")

def save():
    myFormats = [('PNG','*.png'), ('JPEG','*.jpg'), ('GIF','*.gif')]
    filename = filedialog.asksaveasfilename(filetypes=myFormats)
 
    if filename: 
         my_image2.save(filename,'jpg')

def open():
    global my_image
    global my_image2
    root.filename=filedialog.askopenfilename(initialdir="/images", title="Select A File", filetypes=(("jpg files","*.jpg"),("all files","*.*")))
    label1 = Label(root, text=root.filename).pack()

    my_image=ImageTk.PhotoImage(Image.open(root.filename))
    height=my_image.height()
    width=my_image.width()

    if int(width)>800:
        new_width = 800/int(width)
        width1=width*new_width
        height1=height*new_width
    else:
        label3=Label(root, text=("Rozmiar Twojego obrazka: "+ width+" x "+height), fg="red").pack()
        label4 = Label(root, text = "To zdjęcie ma za mały rozmiar", fg="black").pack()
    
    my_image2=ImageTk.PhotoImage(Image.open(root.filename).resize((int(width1),int(height1)), Image.ANTIALIAS))

    label2 = Label(root,image=my_image2).pack(pady=20)

button = Button(root,text="Openfile", command=open).pack()
butto2=Button(root,text="Zapisz na dysku", command=save).pack()

root.mainloop()

Wszystko by było dobrze gdyby nie błąd: AttributeError: 'PhotoImage' object has no attribute 'save', próbowałem na wszystkie strony i za każdym razem nie udaje się zapisać zdjęcia.
W linii my_image2=ImageTk.PhotoImage(Image.open(root.filename).resize((int(width1),int(height1)), Image.ANTIALIAS)) próbowałem my_image2=my_image.resize((int(width1),int(height1)), Image.ANTIALIAS)) ale wywala błąd o braku atrybutu resize.
Resize działa tylko w ten sposób. Mój system to Windows. Czy możecie mi pomóc?

0

@slavoHeys: Masz napisane " 'PhotoImage' object has no attribute 'save'", operujesz na obiekcie tego typu w taki sposób, jak na obiektach PIL.Image, to tak nie działa.
Najpierw konwertujesz ten obiekt na typ PIL.Image, a później wywołujesz na nim save czy tam resize.

0

@Eldorad O.: Niestety nie mam pojęcia jak to zrobić przynajmniej na tym etapie nauki.

2

@slavoHeys: https://stackoverflow.com/questions/58389742/how-to-convert-imagetk-to-image

Jeżeli nie wiesz jak coś zrobić, to najpewniej na stackoverflow będzie odpowiedź, także skorzystaj na przyszłość.

1

@Eldorad O.: Dzięki za pomoc udało się rozwiązać problem, poniżej kod dla innych:

from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog
import os

root=Tk()
root.title("Upload")
root.geometry("900x700")

def save():
    my_image3=ImageTk.getimage(my_image2)
    my_image3.save(os.path.join("image", "1.png"),"PNG")
    my_image3.close()

def open():
    global my_image
    global my_image2
    root.filename=filedialog.askopenfilename(title="Select A File", filetypes=(("jpg files","*.jpg"),("all files","*.*")))
    label1 = Label(root, text=root.filename).pack()

    my_image=ImageTk.PhotoImage(Image.open(root.filename))
    height=my_image.height()
    width=my_image.width()

    if int(width)>800:
        new_width = 800/int(width)
        width1=width*new_width
        height1=height*new_width
    else:
        label3=Label(root, text=("Rozmiar Twojego obrazka: "+ width+" x "+height), fg="red").pack()
        label4 = Label(root, text = "To zdjęcie ma za mały rozmiar", fg="black").pack()
    
    my_image2=ImageTk.PhotoImage(Image.open(root.filename).resize((int(width1),int(height1)), Image.ANTIALIAS))
    
    label2 = Label(root,image=my_image2).pack(pady=20)

button = Button(root,text="Openfile", command=open).pack()
butto2=Button(root,text="Zapisz na dysku", command=save).pack()

root.mainloop()

Jeszcze raz dzięki za pomoc i podsunięcie pomysłu :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1