[英]Tkinter: format RGB values into string
我是Tkinter(和Python)的新手,我想找到將RGB值格式化為字符串的最有效方法,以便它可以與PhotoImage.put()
函數一起使用。
假設我有一個存儲RGB值的Numpy 3級數組,第3維的紅色,綠色和藍色的長度分別為3。 最直觀的處理方式是:
for i in range(0, n_pixels_x):
for j in range(0, n_pixels_y):
hexcode = "#%02x%02x%02x" % (array[i,j,0], array[i,j,1], array[i,j,2])
img.put(hexcode, (j,i))
不幸的是,這對於大圖像來說太慢了。
如PhotoImage Wiki中所述,可以將一個大字符串傳遞給put()
因此該函數僅被調用一次。 然后,我需要將數組有效地轉換為這樣的字符串,該字符串的格式應如下所示(對於4x2圖像):
"{#ff0000 #ff0000 #ff0000 #ff0000} {#ff0000 #ff0000 #ff0000 #ff0000}"
同樣,可以使用嵌套的for循環輕松完成此操作,但是出於效率考慮,我希望避免使用它們。 有什么方法可以使用join()
來做我想要的嗎?
如果需要,我可以以其他方式存儲數組的內容,唯一的限制是我應該能夠輕松修改顏色值。
編輯:經過一些努力之后,我發現了一種格式化值的方法比使用嵌套循環快約10倍。 這是注釋的代碼段:
# 1. Create RGB array
array = np.zeros((n_pixels_x*n_pixels_y, 3))
array = np.asarray(array, dtype = "uint32")
array[1,:] = [0, 100, 255]
# 2. Create a format string
fmt_str = "{" + " ".join(["#%06x"]*n_pixels_x) + "}"
fmt_str = " ".join([fmt_str]*n_pixels_y)
# 3. Convert RGB values to hex
array_hex = (array[:,0]<<16) + (array[:,1]<<8) + array[:,2]
# 4. Format array
img_str = fmt_str % tuple(array_hex)
對於640x480的陣列,第3步和第4步需要約0.1s才能在我的筆記本電腦上執行(用timeit.default_timer()
評估)。 使用嵌套循環,它需要0.9s至1.0s。
我仍然想減少計算時間,但是我不確定在這一點上是否仍有任何改進的可能。
我能夠找到另一種格式化數組的方法,這似乎是最快的解決方案。 解決方案是簡單地使用Image
和ImageTk
直接從數組生成圖像對象:
array = np.zeros((height, width, 3), 'uint8')
imageObject = Image.fromarray(array)
img = ImageTk.PhotoImage(image = imageObject, mode = 'RGB'))
這大約需要0.02s的時間來運行,這足以滿足我的需要,並且不需要使用put()
函數。
我實際上從另一個問題找到了這個答案: 如何將numpy數組轉換為(並顯示)圖像?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.