2011-04-30 136 views
14

我正在用PHP進行ODP-> HTML轉換。我有一個問題,以下內容:背景圖像黑暗還是光線?

使用的樣式:使用窗口的字體,顏色 屬性來指定 窗口前景色是否應該不會像作爲前景色爲 淺色背景 顏色和白色爲 深色背景顏色。

(OpenDocument格式規範1.0版,15.4.4)

如果我有一個背景圖像,如何檢查,如果這個形象是淺色或深色?

你有什麼想法嗎?

由於提前, 島

回答

32

我認爲這是一個很有趣的問題來解決,所以我設計了一個簡單快速的腳本來做到這一點。按照提供的其他建議

<?php 

    // TODO supply your own filenames 
    $filenames = array(
     'testpics/client-bella-vi.jpg', 
     'testpics/istockphoto_8577991-concept-of-business-people-crowd.jpg', 
     'testpics/medium-gray.jpg'); 

    // loop though each file 
    foreach ($filenames as $filename) { 

     echo "$filename<br/>"; 

     $luminance = get_avg_luminance($filename,10); 
     echo "AVG LUMINANCE: $luminance<br />"; 

     // assume a medium gray is the threshold, #acacac or RGB(172, 172, 172) 
     // this equates to a luminance of 170 
     if ($luminance > 170) { 
      echo "Black Text<br />"; 
     } else { 
      echo 'White Text<br />'; 
     } 

     echo "<br />"; 
    } 
    exit; 

    // get average luminance, by sampling $num_samples times in both x,y directions 
    function get_avg_luminance($filename, $num_samples=10) { 
     $img = imagecreatefromjpeg($filename); 

     $width = imagesx($img); 
     $height = imagesy($img); 

     $x_step = intval($width/$num_samples); 
     $y_step = intval($height/$num_samples); 

     $total_lum = 0; 

     $sample_no = 1; 

     for ($x=0; $x<$width; $x+=$x_step) { 
      for ($y=0; $y<$height; $y+=$y_step) { 

       $rgb = imagecolorat($img, $x, $y); 
       $r = ($rgb >> 16) & 0xFF; 
       $g = ($rgb >> 8) & 0xFF; 
       $b = $rgb & 0xFF; 

       // choose a simple luminance formula from here 
       // http://stackoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color 
       $lum = ($r+$r+$b+$g+$g+$g)/6; 

       $total_lum += $lum; 

       // debugging code 
    //   echo "$sample_no - XY: $x,$y = $r, $g, $b = $lum<br />"; 
       $sample_no++; 
      } 
     } 

     // work out the average 
     $avg_lum = $total_lum/$sample_no; 

     return $avg_lum; 
    } 
+0

您對600x400左右的圖片樣本數量有何建議?我認爲10是不是真的工作.. PS真棒答案! – maxisme 2015-09-02 16:27:51

+0

例如https://farm6.staticflickr.com/5478/14085542631_6649f0a995_b.jpg即將爲107,這是很輕,可能不會用白色字體的工作。和https://farm4.staticflickr.com/3912/15197127275_74754c631f_b.jpg即將到來97,它非常黑暗? (這是100個NUM樣品時) – maxisme 2015-09-02 16:34:57

+0

這是一個有點試驗和錯誤的,但對於一個開始你的形象是1024x683 = 700000個像素左右,除以100,你必須每7000個像素1個樣本。樣本只需要着陸在港口的這些燈光中的一些燈上,它就會將平均值拋出。我會碰一下,嘗試1000個樣本,看看你得到了什麼。時間,看看什麼是您的性能需求尚可, – bumperbox 2015-09-02 21:00:35

4

你可能使用一些圖像處理算法,將檢查像素的亮度和計算平均圖像亮度。

該文件將讓你開始:

http://www.kweii.com/site/color_theory/2007_LV/BrightnessCalculation.pdf

+0

我看到有很多不同的公式計算亮度,我應該使用哪一個?亮度? – levu 2011-05-08 06:53:42

+0

這取決於您的確切需求,但我認爲luma或任何其他人都可以爲您的問題做好工作。 – oktalBlizzard 2011-05-08 07:11:59

+0

只需選擇並修改你認爲最容易理解的算法。 – oktalBlizzard 2011-05-08 07:15:06

3

如果你正在尋找使用GD,使用imagecolorat採樣圖像的像素嘗試。您可以確定PHP手冊頁上顯示的顏色的RGB。

接着,取RGB樣品(多個),並使用basic luminance formula確定它們的亮度。

確定你考慮光與暗,並相應分類的閾值。