Преобразование текущего изображения в черно-белое

#python #python-3.x #list #python-2.7

#питон #python-3.x #Список #python-2.7 #python

Вопрос:

Цель состоит в том, чтобы преобразовать текущее изображение в окне графического интерфейса в черно-белое

Ниже приведен мой код:

 def BlackAndWhite(self):

        from images import Image
        
        LoadAFile = self.inputText.getText()
        CurrentImage = open(LoadAFile)
        image = self.image = PhotoImage(file = LoadAFile)
        image.draw()
        BlackAndWhite(image)
        image.draw()
        self.imageLabel["image"] = self.image
        
          
        blackPixel = (0,0,0)
        whitePixel = (255,255,255)
        for y in range(image.getHeight()):
            for x in range(image.getWidth()):
                (r,g,b) = image.getPixel(x,y)
                average = (r b g) /3
                if average < 128:
                    image.setPixel(x,y,blackPixel)
                else:
                    image.setPixel(x,y, whitePixel)
  

Я получаю это сообщение об ошибке:

 image.draw()
AttributeError: 'PhotoImage' object has no attribute 'draw'
  

Комментарии:

1. PhotoImage является подклассом Image , и ни один из них не имеет .draw() метода, отсюда и ошибка. Чего я не понимаю, так это того, что вы хотели сделать, вызвав этот метод в первую очередь. Может быть, вы ищете .place(x, y) ?

2. Я не знаю другого способа преобразовать изображение в черно-белое

Ответ №1:

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

 from tkinter import Tk, Canvas, NW
from PIL import ImageTk, Image

root = Tk()
canvas = Canvas(root, width=1000, height=1000)
canvas.pack()
img = Image.open("PATH_TO_AN_IMAGE")

blackPixel = (0, 0, 0)
whitePixel = (255, 255, 255)

for y in range(img.height):
    for x in range(img.width):
        pixelVal = img.getpixel((x, y))

        # Unpacking in this way in case the pixel contains more than R, G, B (ex: a png)
        r, g, b = pixelVal[0:3]

        average = (r   b   g) / 3
        if average < 128:
            img.putpixel((x, y), blackPixel)
        else:
            img.putpixel((x, y), whitePixel)

photoimage = ImageTk.PhotoImage(img)

canvas.create_image((20, 20), anchor=NW, image=photoimage, state="normal")
root.mainloop()