2011-04-30 100 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确定它们的亮度。

确定你考虑光与暗,并相应分类的阈值。