2017-01-22 4 views
0

У меня есть программа обработки изображений, которая похожа на фотошоп, но очень проста (кнопки и изображение). В моей программе вы можете выбрать изображение, которое хотите использовать и изменить. В настоящее время я работаю над частью программы, но когда я использую изображение CheGevara («chev.png»), он дает следующую ошибку (функция «def PopArt()»):Python PIL int объект не подлежит подписке

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\EduPython\App\lib\tkinter\__init__.py", line 1538, in __call__ 
    return self.func(*args) 
    File "C:\Users\omar\Desktop\azer\Test 1.py", line 52, in PopArt 
    o=int((p[0]+p[1]+p[2])/3) 
TypeError: 'int' object is not subscriptable 

Когда я использую другие изображения, такие как «fleur1.png» или «face.png», он отлично работает и отображает модификацию просто отлично. Вот код:

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) 






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




main.mainloop() 

Вот образы, которые я использовал (все из них детские, но chev.png и fleur.png были преобразованы из JPG и fleur1.png был изменен с fleur.png):

chev.png

EDIT: другие изображения в комментариях, потому что я не могу поставить больше чем 1 ссылку на мой пост

+0

Я не могу опубликовать более 1 ссылки (менее 10 репутации), поэтому я помещаю их в комментарии: [face.png] [2]; [2]: https://i.stack.imgur.com/bz9Gd.png –

+0

[fleur1.png] [3]; [3]: https://i.stack.imgur.com/JtgH4.png –

+0

[fleur.png] [4]; [4]: https://i.stack.imgur.com/ZqPYr.png –

ответ

1

на самом деле я нашел решение. Мой chev.png был уровнем серого изображения, поэтому его значение пикселей было единственным целым числом, где остальные были кортежами (R, G, B). Так что все, что я должен был сделать проверить тип пикселя:

if type(p)==int: 

тогда, если это целое число, он преобразует его в кортеж:

p=(p,p,p) 

и вы все готово;)

+0

Было бы лучше преобразовать изображение в RGB. Если изображение индексируется, то 'p' будет индексом цвета, а кортеж' (p, p, p) 'вообще не будет представлять фактический цвет пикселя. Просто выполните 'px = Ima1.load(). Convert ('RGB')'. –

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

  • Нет связанных вопросов^_^