5

ここに問題があります。特定のベクトル場をビットマップとして視覚化したい。表現自体は問題ないので、[255,255,115]のようなRGBリストのマトリックスはすでにありますが、画面に描画する方法がわかりません。これまでのところ、私は何千もの色付きの1pxの長方形を作成していますが、これは遅すぎます。ビットマップを描画するためのより良い方法があると確信しています。

4

2 に答える 2

13

試み3-私は最後の1つを誓います...

これがこれを行うための最速の純粋な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メソッドを使用

私はこれをテストとして書きました。2.67GhzのIntelCore2デュオでは、ランダムなRGB値を生成する時間を含めて0.6秒で約5000ピクセルを描画します。

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 に答える