2013-05-06 80 views
16

Heyoh SO,設置基於室外溫度的背景顏色

我有一個溫度小部件可以在我正在進行的項目上實現。 沒有什麼特別困難,我有一個免費的API來檢索我需要的數據。

,但可愛的設計師誰與我的作品將有一個顏色特徵爲這我沒有好主意,開始與...

,他將確定根據當前的天氣背景色溫度。

Temperature color schema

我的意思是,如果溫度是冷的,像-20,背景顏色應該是藍色/紫色/任何冷顏色;當它像25一樣溫暖時,它應該有一個熱的背景顏色,如橙色/紅色。

我想我可以很容易地處理一系列「溫度步驟」,但我更喜歡使用可以根據溫度定義顏色的函數。我知道這很奇怪,我不知道是否有算法通過它的溫度顏色來定義顏色... 這篇文章是有用的http://en.wikipedia.org/wiki/Color_temperature但相當複雜,如果有人有任何想法,即使是一開始,我很感興趣!

我看到這個線程: Display temperature as a color with C#?

但我不會用C#和我不想要,所以如果有一個JavaScript的解決方案,這將是完美的。如果存在服務器端需求,我最終可以使用PHP或NodeJS。

編輯 - 答

最後,我沒有用的,因爲圖形需求的真實色彩梯度排列,選擇。 但我仍然需要根據溫度混合最接近的步驟的顏色! 我寫了一個小JS庫來做到這一點,你很快就能在GitHub上找到,我會在這裏發佈鏈接。

你可以在這裏找到:

The presentation website of the project

Or the github project

+0

你爲什麼不只是添加基於一些有條件的邏輯相應的CSS類? – 2013-05-06 13:24:54

+0

你的意思是添加一個像.temperature-minus-20這樣應該顯示一個已定義的背景顏色的類?我知道這是一種行之有效的方式,但我必須事先在CSS中定義所有這些類,如果可能的話,我寧願不以「基於步驟」的方式來管理它們! – 2013-05-06 13:32:23

+0

不完全是,但只是得到一個可以表示的值的一般範圍。 – 2013-05-06 13:36:17

回答

1

最近我有這個難題,使用時間數據顯示天空的色彩,到時候會對應。這是艱難的,我有三種方法探索:

1)糟糕的方式:爲你的R,G,B通道單獨製作一個函數,它將接受x溫度的截距,並吐出一個y - 在溫度範圍和相應顏色範圍內爲紅色通道,藍色通道和綠色通道截取。爲了做到這一點,我會逆向設計它,方法是沿着顏色範圍對某些主要溫度分區進行採樣,然後繪製儘可能多的點,然後通過每個通道的點繪製6次多項式。你會得到一個函數,它可以接受一個溫度值,並將RGB輸出的R,G和B通道的三個輸出合併爲alpha 1.應該可以工作,但還沒有測試過,不願意哈哈

2)爲每種主要顏色製作一個背景類(您決定是5種還是50種顏色),並用alpha混合來切換它們。這就是我最終用於解決問題的方法。

if(temp > 0 && temp <= 5) 
{ 
    greenBackground.alpha == 1 
    yellowBakckground.alpha == (temp/5) 
} 
else if(temp > 5 && temp <= 10) 

等等

所以,如果您的臨時爲2.5那麼這將是50%,混合黃色和綠色

我能夠實現1晚,這個選項的結果看起來大!這很費時間,但可以做到,而不是像你想象的那樣混亂。

3)根據所有可能的整數(不存在許多介於-30和30之間)製作並存儲RGB梯度採樣的數組,並根據需要將API數據四捨五入爲整數值。那將是我想的最簡單的。絕對不像選項1一樣酷:)

祝你好運!

+0

第一個選項看起來非常棒!但我不確定要理解所有要點,稍後我會集中精力。我目前正在使用第三個選項,它以我期望的更乾淨的方式工作。不過,我會花一些時間思考第一個問題!謝謝 ! – 2013-05-09 19:05:26

1

關於色溫的維基百科文章未與您的問題聯繫。維基百科文章僅與數字成像專家相關。在這種情況下的色溫意味着不同的東西...

你的問題是關於如何以攝氏度可視化一定的溫度。沒有標準的算法來做到這一點。設計師應該如何解決這個問題。

我可能會建立一個rgb值的數組,每2.5°C或5°C,然後融合rgb溫度值之間。

+0

混合只有色調不同的顏色的RGB值傾向於產生「泥濘」的混合色。 – Alnitak 2013-05-09 18:28:51

+0

你是對的,你們兩個,我發現了這些觀點,但沒有很好的感覺去編輯這個問題,直到它重新開放!但是,謝謝!我目前使用的是漸變數組,效果很好,但您必須選擇顏色步驟以避免「渾濁」問題。 和@Alnitak,因爲我在LAB色彩空間工作,我可以避免混合問題 - 至少我猜。 – 2013-05-09 18:57:00

+1

如果intervalls不是太大,那麼RGB看起來確定。我準備了一個例子[這裏](http://www.workwithcolor.com/mm-color-blender-01.htm?cp=F90606&ch=0-95-50&cp2=F5A300&ch2=40-100-48&im=8&cm=0) 。實驗室可能是最好的,但性能較差... – John 2013-05-09 20:14:59

5

你的顏色範圍看起來是相同的,爲「色調 - 只有」在「HSL色彩空間」從270º(violetish)在-30℃掃至30°(橙色)在30℃+

var hue = 30 + 240 * (30 - t)/60; 

如果t超出範圍,請在調用上述表達式之前將其夾緊,或者之後將h鎖定到所需的色調範圍。

在支持的瀏覽器上,您可以使用顏色字符串hsl(h, s, l)或使用常用的"HSL to RGB"函數將HSL顏色轉換爲RGB。

http://jsfiddle.net/V5HyL/

+0

該項目是基於webkit的,但我想開發一個我可以在許多瀏覽器上使用的庫,所以我認爲我更願意轉換爲RGB。 無論如何非常感謝,我會嘗試將其整合到我目前的解決方案中,並讓您知道我的反饋! – 2013-05-09 18:55:54

+0

我喜歡你要去的地方,但是如何從你的色調計算中獲得h,s和l值?還有,在電影裏? – Redtopia 2014-12-19 04:30:42

+0

我不知道OP的「t」是什麼,但它看起來很可能是Celcius。我的答案只是將範圍'[-30 .. +30]'映射到'[270 .. 30]'。 S和L看起來都是0.7的大關。 – Alnitak 2014-12-20 09:55:32

3

這是一個特殊的情況,而不是一個通用的解決方案,而是通過簡單地做色調之間的線性漸變,並蜷縮在中間範圍內的混合物(即綠色),你可以得到一個合理的近似沒有顏色踏步:

演示:http://jsfiddle.net/bcronin/kGqbR/18/

// 
// Function to map a -30 to 30 degree temperature to 
// a color 
// 
var F = function(t) 
{ 
    // Map the temperature to a 0-1 range 
    var a = (t + 30)/60; 
    a = (a < 0) ? 0 : ((a > 1) ? 1 : a); 

    // Scrunch the green/cyan range in the middle 
    var sign = (a < .5) ? -1 : 1; 
    a = sign * Math.pow(2 * Math.abs(a - .5), .35)/2 + .5; 

    // Linear interpolation between the cold and hot 
    var h0 = 259; 
    var h1 = 12; 
    var h = (h0) * (1 - a) + (h1) * (a); 

    return pusher.color("hsv", h, 75, 90).hex6(); 
}; 
+0

是的,謝謝,聽起來很有趣,你可以解釋一下你使用的常量是什麼?它是基於漸變值還是任何算法? – 2013-05-09 21:47:31

+0

好點。冪函數中的常量.35是完全任意的。這壓縮了梯度的中間「很好」。 h0和h1是色調值(0-360),如原始問題中映射爲紫色和橙紅色(大致)。 75和90是顏色的任意飽和度和數值。換句話說,常量只基於什麼看起來很好,而不是基於任何形式的基於物理的算法。 – Ben 2013-05-10 02:29:12