2013-04-28 76 views
0

我試圖創建一個小的腳本,其產生兩種顏色,如果一個作爲背景,一個作爲字體顏色,將根據以下準則是可讀:優化彩色圖像生成可讀性

http://www.hgrebdes.com/colour/spectrum/colourvisibility.html

Web可訪問準則從W3C(和不足)

顏色可見性可以根據下列 算法來確定:

(這是所提出的算法,仍然是開放的改變。)

兩種顏色提供良好的顏色可見度,如果亮度差 和兩個顏色之間的色差是大於設定 範圍更大。 ((紅色值X 299)+(綠色值X 587)+(藍色值X 114))/ 1000注意:這個 算法取自一個公式轉換公式RGB值爲YIQ 值。該亮度值爲 顏色提供了可感知的亮度。 (最大(紅色) 值1,紅色值2) - 最小值(紅色值1,紅色值2))+(最大值 (綠色值1,綠色值2) - 最小值(綠色值1,綠色值 2))+(最大(藍色值1,藍值2) - 最小(藍色值1, 藍值2))

範圍爲顏色亮度差別是125顏色 的區別是500.

我的代碼是:

do { 

    $bg[0] = rand(0, 255); 
    $bg[1] = rand(0, 255); 
    $bg[2] = rand(0, 255); 
    $bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000; 

    $txt[0] = rand(0, 255); 
    $txt[1] = rand(0, 255); 
    $txt[2] = rand(0, 255); 
    $txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000; 

    //Brightness Difference = Brightness of color 1 - Brightness of color 2 
    $brightnessDifference = abs($bg[3] - $txt[3]); 

    //Color difference = Maximum (Red1, Red2) - Minimum (Red1, Red2) etc for Blue and Green 
    $colorDifference = max($bg[0], $txt[0]) - min($bg[0], $txt[0]) + max($bg[1], $txt[1]) - min($bg[1], $txt[1]) + max($bg[2], $txt[2]) - min($bg[2], $txt[2]); 
} while($brightnessDifference < 125 || $colorDifference < 500) 

但是執行時間超過了PHP允許的時間......關於如何優化它的建議? :)

回答

1

您有一個導致無限循環的錯誤,使您的腳本運行時間超過最大腳本執行時間。

這三行代碼中的有車:

$bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000; 
$txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000; 
$brightnessDifference = abs($bg[3] - $txt[3]); 

$brightnessDifference永遠不會大於125,所以while()將永遠運行。

這裏是該溶液中,從你的問題引述:

顏色亮度由下面的公式確定:((紅色值X 299)+(綠色值X 587)+(藍色值X 114) )/ 1000注意:此算法取自將RGB值轉換爲YIQ值的公式。這個亮度值給出了一種顏色的感知亮度。

你問的優化,雖然你不需要它,一旦你刪除了錯誤,你的代碼可以通過改變rand()進行優化:

do { 

    $bg[0] = rand() & 255; 
    $bg[1] = rand() & 255; 
    $bg[2] = rand() & 255; 
    $bg[3] = ($bg[0] + $bg[1] + $bg[2])/1000; 

    $txt[0] = rand() & 255; 
    $txt[1] = rand() & 255; 
    $txt[2] = rand() & 255; 
    $txt[3] = ($txt[0] + $txt[1] + $txt[2])/1000; 

    //Brightness Difference = Brightness of color 1 - Brightness of color 2 
    $brightnessDifference = abs($bg[3] - $txt[3]); 

    //Color difference = Maximum (Red1, Red2) - Minimum (Red1, Red2) etc for Blue and Green 
    $colorDifference = max($bg[0], $txt[0]) - min($bg[0], $txt[0]) + max($bg[1], $txt[1]) - min($bg[1], $txt[1]) + max($bg[2], $txt[2]) - min($bg[2], $txt[2]); 
} while($brightnessDifference < 125 || $colorDifference < 500) 

您節省高達30%的執行時間。