2009-10-17 9 views
4

여기에 문제가 있습니다. 특정 벡터 필드를 비트 맵으로 시각화하고 싶습니다. 표현 자체는 괜찮아요. 그래서 저는 이미 [255,255,115]와 같은 RGB리스트의 매트릭스를 가지고 있습니다. 그러나 그것을 스크린에 그리는 방법에 대해서는 잘 모르겠습니다. 지금까지 수천 개의 컬러 1px 사각형을 만들었지 만 너무 느립니다. 나는 비트 맵을 그리는 더 좋은 방법이있을 것이라고 확신한다.Tk 만 사용하여 파이썬에서 비트 맵을 빨리 그리는 방법은 무엇입니까?

답변

12

ATTEMPT 3 - 나는 마지막 하나를 맹세 ...

나는이이 작업을 수행 할 수있는 가장 빠른 순수 TK의 방법입니다 생각합니다. 목록 목록에서 10,000 개의 RGB 값을 생성하고 Tkinter.PhotoImage를 만든 다음 픽셀 값을 그 안에 넣습니다.

import Tkinter, random 
class App: 
    def __init__(self, t): 
     self.i = Tkinter.PhotoImage(width=100,height=100) 
     colors = [[random.randint(0,255) for i in range(0,3)] for j in range(0,10000)] 
     row = 0; col = 0 
     for color in colors: 
      self.i.put('#%02x%02x%02x' % tuple(color),(row,col)) 
      col += 1 
      if col == 100: 
       row +=1; col = 0   
     c = Tkinter.Canvas(t, width=100, height=100); c.pack() 
     c.create_image(0, 0, image = self.i, anchor=Tkinter.NW) 

t = Tkinter.Tk() 
a = App(t)  
t.mainloop() 

ATTEMPT 1 - 내가 테스트로이 쓴 create_rectangle 방법

를 사용하여. -

내가 아는 PIL를 사용

from Tkinter import * 
import random 

def RGBs(num): 
# random list of list RGBs 
return [[random.randint(0,255) for i in range(0,3)] for j in range(0,num)] 

def rgb2Hex(rgb_tuple): 
    return '#%02x%02x%02x' % tuple(rgb_tuple) 

def drawGrid(w,colors): 
col = 0; row = 0 
colors = [rgb2Hex(color) for color in colors] 
for color in colors: 
    w.create_rectangle(col, row, col+1, row+1, fill=color, outline=color) 
    col+=1 
    if col == 100: 
    row += 1; col = 0 

root = Tk() 
w = Canvas(root) 
w.grid() 
colors = RGBs(5000) 
drawGrid(w,colors) 
root.mainloop() 

ATTEMPT 2 : 2.67 GHz의 인텔 코어 2 듀오, 그것은 내 임의의 RGB 값을 생성 할 수있는 시간을 포함하여 0.6 초에 약 5000 픽셀을 그릴 수 있습니다 당신은 TK 만 말했지만 PIL은 이것을 정말로 쉽고 빠릅니다.

def rgb2Hex(rgb_tuple): 
    return '#%02x%02x%02x' % tuple(rgb_tuple) 

num = 10000 #10,000 pixels in 100,100 image 
colors = [[random.randint(0,255) for i in range(0,3)] for j in range(0,num)] 
colors = [rgb2Hex(color) for color in colors] 
im = Image.fromstring('RGB',(100,100),"".join(colors)) 
tkpi = ImageTk.PhotoImage(im) 
## add to a label or whatever... 
label_image = Tkinter.Label(root, image=tkpi) 
+3

시도 3은 대폭 빨라질 수 있습니다. 일반적으로 픽셀 배열을 구성하고 모든 단일 픽셀에 대해 "넣기"를 수행하는 대신 단일 "배치"를 수행하는 것이 훨씬 빠릅니다. –

4

빠른 순수 Tkinter의 방법이 있습니다 :

import Tkinter, random 
import random 

class App: 
    def __init__(self, t): 
     self.width = 320 
     self.height = 200 
     self.i = Tkinter.PhotoImage(width=self.width,height=self.height) 
     rgb_colors = ([random.randint(0,255) for i in range(0,3)] for j in range(0,self.width*self.height)) 
     pixels=" ".join(("{"+" ".join(('#%02x%02x%02x' % 
      tuple(next(rgb_colors)) for i in range(self.width)))+"}" for j in range(self.height))) 
     self.i.put(pixels,(0,0,self.width-1,self.height-1)) 
     c = Tkinter.Canvas(t, width=self.width, height=self.height); c.pack() 
     c.create_image(0, 0, image = self.i, anchor=Tkinter.NW) 

t = Tkinter.Tk() 
a = App(t)  
t.mainloop() 

당신은 넣어 사용할 수 있습니다()이 경우, 전체 이미지를 일부 컬러 데이터 (문자열)와 사각형을 그립니다. 이렇게하면 꽤 비싼 루프가 필요하지 않습니다.

관련 문제