Оптимизация инверсии цвета - библиотека Python Tkinter - PullRequest
0 голосов
/ 13 октября 2011

Сегодня я попытался создать код Python для инвертирования цветов изображения .gif с использованием библиотеки Tkinter. Код работает и делает именно то, что я ожидал, но для работы на процессоре 3,4 ГГц требуется около 50 секунд. У меня проблемы с просмотром, что я могу изменить, чтобы оптимизировать это. По сути, я перебираю каждый пиксель в изображении, собираю значения цвета, преобразую их в список целых чисел (чтобы манипулировать ими математически), инвертирую каждое значение цвета (новое значение цвета = 255 - старое значение цвета), преобразовываю их вернуться к строке, чтобы метод «put» PhotoImage мог их обработать, переписать изображение и, наконец, отобразить перевернутое изображение. Я не могу думать о том, что изменить. Я имею в виду, что прохождение каждого пикселя должно быть частью медлительности, но разве этот процесс не является абсолютно необходимым?

from Tkinter import *
import tkMessageBox

class GUIFramework(Frame):
    def __init__(self, master=None):

    Frame.__init__(self, master)

    self.grid(padx=0, pady=0)
    self.btnDisplay = Button(self, text="Display!", command=self.Display)
    self.btnDisplay.grid(row=0, column=0)

    def Display(self):
        a = ''
        b = []
        self.imageDisplay = PhotoImage(file='C:\image.gif')
        for x in range(0, self.imageDisplay.width()):
            for y in range(0, self.imageDisplay.height()):
                value = self.imageDisplay.get(x,y)
                for i in value:
                    try:
                        c = int(i)
                        a += (i)
                    except:
                        b.append(int(a))
                        a = ''
                b.append(int(a))
                for i in range(0,3):
                    b[i] = (255 - b[i])
                self.imageDisplay.put('#%02x%02x%02x' %tuple(b), (x,y))
                b = []
                a = ''
        c = Canvas(self, width=700, height=700); c.pack()
        c.grid(padx=0,pady=0, column=0, row=0)
        c.create_image(0,0, image = self.imageDisplay, anchor = NW)

if __name__ == "__main__":
    guiFrame = GUIFramework()
    guiFrame.mainloop()

Заранее спасибо за помощь. -Seth

1 Ответ

4 голосов
/ 13 октября 2011

Попробуйте это:

def Display(self):
    self.imageDisplay = PhotoImage(file='C:\image.gif')
    for x in xrange(0, self.imageDisplay.width()):
        for y in xrange(0, self.imageDisplay.height()):
            raw = self.imageDisplay.get(x, y)
            rgb = tuple(255 - int(component) for component in raw.split())
            self.imageDisplay.put('#%02x%02x%02x' % rgb, (x, y))
    c = Canvas(self, width=700, height=700); c.pack()
    c.grid(padx=0,pady=0, column=0, row=0)
    c.create_image(0,0, image = self.imageDisplay, anchor = NW)

Edit: Новая версия (быстрее и с оптимизацией от Джастина Пила).

def Display(self):
    self.imageDisplay = PhotoImage(file='C:\image.gif')

    wrange = xrange(0, self.imageDisplay.width())
    hrange = xrange(0, self.imageDisplay.height())
    get = self.imageDisplay.get
    put = self.imageDisplay.put

    def convert_pixel(raw):
        return ('#%02x%02x%02x' %
            tuple(255 - int(component) for component in raw.split(' ')))

    for y in hrange:
        put('{' + ' '.join(convert_pixel(get(x, y)) for x in wrange) + '}', (0, y))

    c = Canvas(self, width=700, height=700);
    c.pack()
    c.grid(padx=0, pady=0, column=0, row=0)
    c.create_image(0, 0, image=self.imageDisplay, anchor=NW)
...