여기에 문제가 있습니다. 특정 벡터 필드를 비트 맵으로 시각화하고 싶습니다. 표현 자체는 괜찮아요. 그래서 저는 이미 [255,255,115]와 같은 RGB리스트의 매트릭스를 가지고 있습니다. 그러나 그것을 스크린에 그리는 방법에 대해서는 잘 모르겠습니다. 지금까지 수천 개의 컬러 1px 사각형을 만들었지 만 너무 느립니다. 나는 비트 맵을 그리는 더 좋은 방법이있을 것이라고 확신한다.Tk 만 사용하여 파이썬에서 비트 맵을 빨리 그리는 방법은 무엇입니까?
4
A
답변
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)
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()
당신은 넣어 사용할 수 있습니다()이 경우, 전체 이미지를 일부 컬러 데이터 (문자열)와 사각형을 그립니다. 이렇게하면 꽤 비싼 루프가 필요하지 않습니다.
시도 3은 대폭 빨라질 수 있습니다. 일반적으로 픽셀 배열을 구성하고 모든 단일 픽셀에 대해 "넣기"를 수행하는 대신 단일 "배치"를 수행하는 것이 훨씬 빠릅니다. –