2011-10-13 4 views
0

오늘 Tkinter 라이브러리를 사용하여 .gif 이미지의 색상을 뒤집을 Python 코드를 만들려고했습니다. 이 코드는 정상적으로 작동하지만 3.4ghz 프로세서에서 실행하는 데 약 50 초가 걸립니다. 이 문제를 최적화하기 위해 내가 무엇을 바꿀 수 있는지 보는 데 어려움을 겪고 있습니다. 기본적으로 이미지의 모든 픽셀을 반복하고 색상 값을 가져 와서 정수 목록으로 변환하고 (수학적으로 조작하기 위해) 각 색상 값을 반전하고 (새 색상 값 = 255 - 이전 색상 값) 변환합니다. PhotoImage의 "put"메서드가 이미지를 처리하고 이미지를 다시 쓰고 마지막으로 거꾸로 된 이미지를 표시 할 수 있도록 문자열로 되돌립니다. 나는 무엇을 변화 시킬지 생각할 수 없다. 즉, 모든 단일 픽셀을 반복하면서 느려지는 부분이되어야하지만,이 과정이 완전히 필요하지는 않습니까?색상 반전 최적화 - Python Tkinter 라이브러리

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

+0

'value'의 내용을 게시 하시겠습니까? 희망적으로 개선 할 수있는 것을 보는 데 도움이 될 것입니다. – TorelTwiddler

+0

아, 네. PhotoImage의 get 메소드는 '255 85 0'과 같은 문자열을 반환합니다. 그 사이에 공백이있는 RGB 값입니다. 문자열을 줄 필요는 없지만 뭐든간에. –

답변

4

이 시도 :

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) 

편집 : 새로운 버전 (저스틴 껍질에서 빠르고와 최적화).

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) 
+1

예, 거의 같아 보이는 광산을 게시하려고했습니다. 마지막으로 작은 최적화는 높이, get 및 put 함수 및 형식 문자열에 대한 변수를 만드는 것입니다. 또한 raw.split ('')는 raw.split()보다 약간 빠릅니다. 그러나 이것들은 현재로서는 아주 작은 최적화입니다. 나머지 시간은 대부분 get 및 put 함수와 문자열 형식화에 소비됩니다. –

+0

이것은 실제로 아주 잘랐습니다. 매우 우아합니다. 지금 약 10 초 걸립니다. 고마워, 얘들 아! 하지만 이해할 수없는 점은 표준 이미지 편집 응용 프로그램이 몇 초 만에이 작업을 수행 할 수 있다는 것입니다. 여기서 문제는 무엇입니까? –