2017-01-22 5 views
0

Я пишу программу на tkinter, подобную фотошопу (обработка изображений), и проблема является одной из моих функций (Moyenne()) сообщает мне индекс вне диапазона, но он работает до но не сейчас. Я искал, но ничего не нашел. Если вам нужна спецификация просто спросить;)PIL индекс изображения за пределами допустимого диапазона

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() 

Я скопировал код в defMoyenne() и поместить его в другом проекте и протестировали его и до сих пор не работает:

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() 
+0

Можете вложить точные ошибки, которые вы получите в своем сообщении? – Tagc

+0

В первом коде я получаю: Traceback (последний последний звонок): Файл «», строка 420, в run_nodebug Файл «C: \ Users \ omar \ Desktop \ azer \ Test 1.py», строка 169, in Moyenne() Файл «C: \ Users \ omar \ Desktop \ azer \ Test 1.py», строка 76, в Moyenne k = px [x + t, y + w] IndexError: индекс изображения out диапазона –

+0

на втором я получаю: Traceback (самый последний вызов последнего): Файл «», строка 420, в run_nodebug Файл «», линия 18, в IndexError: индекс изображения из диапазона –

ответ

1

вашу проблему вызвано этими заявлениями в теле Moyenne():

x=x-1 
y=y-1 

по какой причине вы вручную декремента переменные цикла в теле цикла. Это в конечном итоге приведет к случаю, когда x станет 0 к моменту достижения вами k=px[x+t,y+w], и если t равно -1, это приведет к попытке получить доступ к пикселю по индексу [-1,y+w], в результате чего вы увидите ошибку «Указатель вне диапазона».

+0

Ну что ж, это было глупо от меня -_-, большое вам спасибо, застряло на этом какое-то время, не осознавая, что ошибка была прямо передо мной;) –

Смежные вопросы