【问题标题】:Optimization of color inversion - Python Tkinter library颜色反转的优化 - Python Tkinter 库
【发布时间】:2011-10-13 04:21:53
【问题描述】:

我今天尝试使用 Tkinter 库创建一个 Python 代码来反转 .gif 图像的颜色。该代码可以正常工作并且完全符合我的预期,但在 3.4ghz 处理器上运行大约需要 50 秒。我很难看到我可以改变什么来优化它。基本上,我遍历图像中的每个像素,获取颜色值,将它们转换为整数列表(以便在数学上操作它们),反转每个颜色值(新颜色值 = 255 - 旧颜色值),转换它们返回一个字符串,以便 PhotoImage 的“put”方法可以处理它们并重写图像,最后显示反转的图像。我想不出要改变什么。我的意思是,循环遍历每个像素肯定是缓慢的一部分,但是这个过程不是完全必要的吗?

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

提前感谢您的帮助。 -赛斯

【问题讨论】:

  • 您介意发布value 的内容吗?希望这将有助于了解可以改进的地方。
  • 啊,是的。 PhotoImage 的 get 方法返回一个如下所示的字符串:'255 85 0'。它只是中间有空格的 RGB 值。似乎没有必要将它们作为字符串给出,但无论如何。

标签: python tkinter colors gif inversion


【解决方案1】:

试试这个:

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)

编辑: 新版本(速度更快,并由 Justin Peel 进行了优化)。

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)

【讨论】:

  • 是的,刚要发布我的,看起来几乎一样。最后的小优化是为高度、get 和 put 函数以及格式字符串创建变量。此外,raw.split(' ') 比 raw.split() 稍快。然而,目前这些都是相当小的优化。其余大部分时间都花在 get 和 put 函数以及字符串格式化上。
  • 这确实减少了很多,而且非常优雅。现在大约需要 10 秒。多谢你们!但是,我不明白标准图像编辑应用程序如何在几秒钟内完成此操作。问题出在哪里?
猜你喜欢
  • 2019-05-29
  • 2014-11-26
  • 2014-12-02
  • 2015-02-09
  • 1970-01-01
  • 2011-06-08
  • 2014-03-03
  • 2012-07-31
  • 2021-10-27
相关资源
最近更新 更多