這是一個問題。我想將特定的矢量場可視化爲位圖。對於表示本身來說沒問題,所以我已經有了像[255,255,115]這樣的RGB列表矩陣,但是我不知道如何在屏幕上繪製它。到目前爲止,我製作了數千個彩色的1px矩形,但是這個工作太慢了。我相信有一個更好的方法來繪製位圖。如何在python中僅使用Tk快速繪製位圖?
4
A
回答
12
未遂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方法
我寫這作爲測試。在2.67千兆赫我的英特爾酷睿2雙核處理器,它會吸取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)
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()
您可以使用put()方法來繪製一些顏色數據(一個字符串)創建一個矩形,在這種情況下,整個圖像。這樣你就不需要很昂貴的循環。
相關問題
- 1. Android繪製快速位圖
- 2. 如何使用android在OGLES2.0中快速繪製圖像?
- 3. 我如何快速繪製地圖
- 4. 如何使用繪圖或ggplot2在R中快速繪製多條線
- 5. 在Android中快速繪製
- 6. 如何在canvas中的onDraw()方法中快速繪製位圖android
- 7. python中的快速繪圖數據
- 8. Python和Matplotlib:在同一個圖上快速繪製多個圖
- 9. 在UIView上快速繪製UIImage圖像
- 10. 如何在matlab中快速繪製三維矢量圖?
- 11. 使用NSBezierPath繪製至少4000段的快速繪圖
- 12. 在Android畫布或OpenGL上繪製位圖速度更快
- 13. 在畫布上快速繪製位圖android ics
- 14. 如何使用Python底圖更快地繪製地理定位的RGB數據
- 15. TeeChart快速繪圖
- 16. 加速位圖在android上的繪製
- 17. WPF快速2D繪圖...使用什麼?
- 18. 在DotNET中進行超快速繪製
- 19. 在pygame中繪製快速線條
- 20. 如何使用位圖繪製路徑?
- 21. 如何在Python中使用OpenCV繪製灰度圖像的32位柱狀圖
- 22. 快速繪製位圖,DirectShow源代碼過濾器
- 23. 如何使用python繪製圖形?
- 24. 如何使用python繪製圖形
- 25. TeeChart快速繪製TFastLineSeries
- 26. 如何在位圖中繪製文本?
- 27. 如何快速重繪QQuickItem?
- 28. 使用Matplotlib在Python中繪製圖形
- 29. 如何在Python中繪製網格圖?
- 30. 如何在Python中繪製樞軸圖?
嘗試3大概可以顯着加快。建立一個像素陣列並做一個「put」而不是爲每個像素做一個「put」通常要快得多。 –