簡體   English   中英

Tkinter:將RGB值格式化為字符串

[英]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。

我仍然想減少計算時間,但是我不確定在這一點上是否仍有任何改進的可能。

我能夠找到另一種格式化數組的方法,這似乎是最快的解決方案。 解決方案是簡單地使用ImageImageTk直接從數組生成圖像對象:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM