这是一个问题。我想将特定的矢量场可视化为位图。表示本身没问题,所以我已经有一些 RGB 列表矩阵,如 [255,255,115],但我不知道如何在屏幕上绘制它。到目前为止,我制作了数千个彩色 1px 矩形,但这太慢了。我确信有更好的方法来绘制位图。
问问题
11107 次
2 回答
13
尝试 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()
尝试 1 - 使用 create_rectangle 方法
我写了这个作为测试。在我的 Intel Core 2 duo 2.67 Ghz 上,它将在 0.6 秒内绘制大约 5000 个像素,包括生成随机 RGB 值的时间:
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()
尝试 2 - 使用 PIL
我知道你只说 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)
于 2009-10-17T18:34:06.300 回答
5
有一个更快的纯 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()
您可以使用 put() 绘制一个带有一些颜色数据(字符串)的矩形,在这种情况下是整个图像。这样你就不需要非常昂贵的循环。
于 2014-10-02T10:12:58.650 回答