簡體   English   中英

如何將 RGB 百分比轉換為 RGB 值?

[英]How to convert RGB percentage to RGB values?

給定顏色的 RGB 百分比,例如“ 野西瓜”, (99%, 42%, 52%) ,正確的 RGB 值是(252, 108, 133)

但是當我嘗試

rgb_percent = ('99%', '42%','52%')
rgb_values = tuple(int(int(s.strip('%')) * 2.55) for s in rgb_percent)
print(rgb_values)

[出去]:

(252, 107, 132)

顏色看起來相似,但它們不是正確的值。 如何正確地將 RGB 百分比轉換為 RGB 值?

我應該將它們四舍五入還是將值轉換為 integer? 這似乎更接近但仍然不是預期值:

tuple(int(round(int(s.strip('%')) * 2.55, 0)) for s in rgb_percent)

[出去]:

(252, 107, 133)

您無法獲得完全相同的值,因為您對數字進行了四舍五入。 100和255不是倍數。 您的 RGB 百分比似乎全部為 integer,因此您至少丟失了 1 位信息(也可能是 2 位)。 因此,您不能期望所有情況下都有准確的值。 (您不能將 map 100 個數字轉換為 256 個值,並獲得所有 256 個值)。

但好處是:你不需要它(通常)。 你的眼睛不太敏感(我們無法看到 RGB 與 256x256x256 值的所有組合:我們的眼睛可以分辨的顏色少得多,所以在某些情況下你看不到差異,而在某些情況下,它幾乎不會被注意到)。 此外,一些監視器面板技巧顯示每個通道僅顯示 64 種不同的色調(很少有人注意到)。 考慮一下,如果您從 JPEG 圖像中獲取數據,則會進行額外的轉換(數據不是存儲為 RGB 數據,而是存儲為 YCC)。

為了獲得最佳選擇,您需要了解原始算法(它們是round還是trunc ?或者您應該進行更大的示例測試,並檢查不同算法之間的差異(例如,有多少案例是精確的,有多少只是 1 關閉, 2 關, 3 關)。

注意:您有 3 種可能性: round()math.floor()math.ceil() 我會避免使用int :根據 Python 文檔,結果似乎取決於系統標准庫(它可能被截斷或四舍五入)。 注意: math.trunc()math.floor()對正數(或零)給出相同的結果。

一般來說,我更喜歡 round:它給出 0% 和 100% 的預期結果(ceil 對於這些極值是相似的)。

PS:沒有“正確的 RGB 值”。 歷史上,RGB 被指定為 0 到 100 之間的數字(也可能是浮點數),或者 0.0 到 1.0。 只是 HTML 被推送到 0 到 255,但如果你有一個可以顯示更多顏色的屏幕,它會導致問題。 可能對於 RGB,您指的是 R*G*B*,所以不是線性 RGB,而是 OETF 校正的 RGB)。

不:沒有可靠的消息來源。 沒有人遵循標准,所以不要指望轉換顏色通道(例如到99% )的人使用完全相同的方法(我們程序員很懶)。 標准傾向於使用浮點數。 注意:程序內部可能使用浮點數,因此在顏色選擇器中,您可能會得到具有相同顯示百分比值的不同顏色,具體取決於您輸入顏色的方式。 還是您指的是指定%-values的特定標准? 我們不能同意黑色是 0、0、0 還是 16、16、16(例如 MPEG-2,或電視,以及其他有限范圍的 RGB設備),或者如何做或解釋伽瑪校正(好的:最近的和更少的 -最近的標准更精確,但大多數程序沒有得到它)。 此外,在讀取您的“RGB”值時,過去我會假設它是 sRGB(因此顏色空間為 web 和 Microsoft),但幾年后 Apple 使用不同的顏色空間(Apple P3),其他人正在擴展sRGB。 混亂。 因此,只需測試不同的方法(並用眼睛檢查質量)。

我沒有重新發現不同顏色代碼的本質,而是研究了這些包並為此找到了一個可用且詳細的 package。 當我們看這個package的代碼時,已經提到並解決了類似的問題。 在位逆向工程的幫助下,通過這個 package,我找到了這樣的方法:

#pip install webcolors #to install
import webcolors as wco
hex = wco.rgb_percent_to_hex(('99%','42%','52%'))
wco.hex_to_rgb(hex)

結果是IntegerRGB(red=252, green=107, blue=133)

雖然沒有rgb_percent_to_rgb function 而不是這個,但我將百分比值轉換為 HEX,然后將它們轉換為值。

是的,在將它們轉換為 int 值之前四舍五入,但請記住 float 值不精確,因此您不會總是得到預期的 output

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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