Megzari Nassim
Megzari Nassim

Reputation: 399

PIL image index out of range

I'm writing a program on tkinter similar to photoshop (image treatment), and the problem is one of my functions (Moyenne()) is telling me index out of range, but it's worked before but not now. I've searched but I haven't found anything. If you need any specification just ask ;)

from tkinter import*
import tkinter as Tkinter
from tkinter import filedialog, DISABLED
import os
import ntpath
from PIL import Image

def EchelleDeGris():
    Ima2=Image.new("RGB",(z[0],z[1]))
    px=Ima1.load()
    px1=Ima2.load()
    for x in range(z[0]):
        for y in range(z[1]):
            p=px[x,y]
            o=int((p[0]+p[1]+p[2])/3)
            px1[x,y]=(o,o,o)
    Ima2.save("ImageMod.png")
    im2 = PhotoImage(file="ImageMod.png")
    main.image = im2
    I2 = Tkinter.Label(main, image=im2)
    I2.grid(row=0, column=3, rowspan =6)

def SupprimerImage():
    I2 = Tkinter.Label(main, image=imt)
    I2.grid(row=0, column=3, rowspan =6)

def Luminosite():
    Ima2=Image.new("RGB",(z[0],z[1]))
    px=Ima1.load()
    px1=Ima2.load()
    for x in range(z[0]):
        for y in range(z[1]):
            p=px[x,y]
            px1[x,y]=(p[0]+S1.get(),p[1]+S1.get(),p[2]+S1.get())
    Ima2.save("ImageMod.png")
    im2 = PhotoImage(file="ImageMod.png")
    main.image = im2
    I2 = Tkinter.Label(main, image=im2)
    I2.grid(row=0, column=3, rowspan =6)

def AnnulerModifications():
    I2 = Tkinter.Label(main, image=im1)
    I2.grid(row=0, column=3, rowspan =6)

def PopArt():
    Ima2=Image.new("RGB",(z[0],z[1]))
    px=Ima1.load()
    px1=Ima2.load()
    for x in range(z[0]):
        for y in range(z[1]):
            p=px[x,y]
            o=int((p[0]+p[1]+p[2])/3)
            if o<85:
                px1[x,y]=(0,0,255)
            elif 85<o<170:
                px1[x,y]=(0,255,0)
            elif o>170:
                px1[x,y]=(255,0,0)
    Ima2.save("ImageMod.png")
    im2 = PhotoImage(file="ImageMod.png")
    main.image = im2
    I2 = Tkinter.Label(main, image=im2)
    I2.grid(row=0, column=3, rowspan =6)

def Moyenne():
    Ima2=Image.new("RGB",(z[0],z[1]))
    px=Ima1.load()
    px1=Ima2.load()
    rouge=0
    vert=0
    bleu=0
    for x in range(1,z[0]):
        for y in range(1,z[1]):
            for t in range(-1,1):
                for w in range(-1,1):
                    k=px[x+t,y+w]
                    if k[0]>k[1] and k[0]>k[2]:
                        rouge=rouge+1
                    if k[1]>k[0] and k[1]>k[2]:
                        vert=vert+1
                    if k[2]>k[1] and k[2]>k[0]:
                        bleu=bleu+1
            x=x-1
            y=y-1
            Max=rouge
            if bleu>Max:
                Max=bleu
            elif vert>Max:
                Max=vert
            pax=px[x,y]
            if Max == rouge:
                pax=(pax[0],0,0)
            if Max == vert:
                pax=(0,pax[1],0)
            if Max == bleu:
                pax = (0,0,pax[2])
    Ima2.show()





main=Tk()

main.withdraw()
currdir = os.getcwd()
a = filedialog.askopenfilename()
main.deiconify()

main.configure(background="#a1dbcd")
main.title("Photoshop Version.Megzari")

Ima1=Image.open(a)
z=Ima1.size
nux=Image.new("RGB",(z[0],z[1]))
nuxy=nux.load()
for x in range(z[0]):
    for y in range(z[1]):
        nuxy[x,y]=(255,255,255)
nux.save("Blank.png")








if z>(400,400):
    im2 = Tkinter.PhotoImage(file="ImageBlank.png")
    main.image = im2
    I2 = Tkinter.Label(main, image=im2)
    I2.grid(padx=20, pady=20, row=0, column=1, rowspan =6)
    T1 = Tkinter.Label(main, image=im2)
    T1.grid(padx=20, pady=20, row=0, column=3, rowspan =6)
    B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=DISABLED)
    B1.grid(padx=20, pady=20, row=0, column=2)
    B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39", state=DISABLED)
    B3.grid(padx=20, pady=20, row=2, column=2)
    S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", state=DISABLED, length = 200)
    S1.grid(row=1, column=2)
    B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39", state=DISABLED)
    B2.grid(padx=20, pady=20, row=4, column=2)
    B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39", state=DISABLED)
    B3.grid(padx=20, pady=20, row=3, column=2)
    B4 = Tkinter.Button(main, text ="Pop Art", command = PopArt, fg="#a1dbcd", bg="#383a39", state=DISABLED)
    B4.grid(padx=20, pady=20, row=5, column=2)
elif z<(400,400):
    im1 = Tkinter.PhotoImage(file=a)
    I1 = Tkinter.Label(main, image=im1)
    I1.grid(padx=20, pady=20, row=0, column=1, rowspan =6)
    imt = Tkinter.PhotoImage(file="Blank.png")
    T1 = Tkinter.Label(main, image=imt)
    T1.grid(padx=20, pady=20, row=0, column=3, rowspan =6)
    B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=NORMAL)
    B1.grid(padx=20, pady=20, row=0, column=2)
    B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39")
    B3.grid(padx=20, pady=20, row=2, column=2)
    S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200)
    S1.grid(row=1, column=2)
    B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39")
    B2.grid(padx=20, pady=20, row=4, column=2)
    B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39")
    B3.grid(padx=20, pady=20, row=3, column=2)
    B4 = Tkinter.Button(main, text ="Pop Art", command = PopArt, fg="#a1dbcd", bg="#383a39")
    B4.grid(padx=20, pady=20, row=5, column=2)

s=S1.get()
Moyenne()




main.mainloop()

I copied the code in the defMoyenne() and put it in another project and tested it and still doesn't work:

from PIL import Image


Ima1=Image.open("face.png")
z=Ima1.size
Ima2=Image.new("RGB",(z[0],z[1]))
px=Ima1.load()
px1=Ima2.load()
rouge=0
vert=0
bleu=0
for x in range(1,z[0]-1):
    for y in range(1,z[1]-1):
        for t in range(-1,1):
            print(t)
            for w in range(-1,1):
                print(w)
                k=px[x+t,y+w]
                if k[0]>k[1] and k[0]>k[2]:
                    rouge=rouge+1
                if k[1]>k[0] and k[1]>k[2]:
                    vert=vert+1
                if k[2]>k[1] and k[2]>k[0]:
                    bleu=bleu+1
        x=x-1
        y=y-1
        Max=rouge
        if bleu>Max:
            Max=bleu
        elif vert>Max:
            Max=vert
        pax=px[x,y]
        if Max == rouge:
            pax=(pax[0],0,0)
        if Max == vert:
            pax=(0,pax[1],0)
        if Max == bleu:
            pax = (0,0,pax[2])
Ima2.show()

Upvotes: 0

Views: 3496

Answers (1)

Tagc
Tagc

Reputation: 9076

Your problem is caused by these statements in the body of Moyenne():

x=x-1
y=y-1

For whatever reason you're manually decrementing your loop variables in the body of the loop. This will eventually result in a case where x becomes 0 by the time you reach k=px[x+t,y+w], and if t is -1 this will result in you trying to access the pixel at index [-1,y+w], causing the "Index out of range" error you see.

Upvotes: 1

Related Questions