【问题标题】:Background image dark or light?背景图像是暗的还是亮的?
【发布时间】:2011-08-16 02:14:12
【问题描述】:

我正在使用 PHP 进行 ODP->HTML 转换。我有以下问题:

使用样式:use-window-font-color 属性来指定是否 窗口前景色应为 用作 a 的前景色 浅色背景颜色和白色 深色背景。

(OpenDocument 规范版本 1.0、15.4.4)

如果我有背景图片,我如何检查这张图片是浅色还是深色?

你有什么想法吗?

提前致谢, 左旋

【问题讨论】:

    标签: php gd opendocument


    【解决方案1】:

    我认为这是一个非常有趣的问题,所以我编写了一个快速脚本来解决这个问题。遵循提供的其他建议

    <?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;
        }
    

    【讨论】:

    • 对于 600x400 左右的图像样本数量,您有什么建议?我认为 10 并没有真正起作用.. PS 很棒的答案!
    • 例如 farm6.staticflickr.com/5478/14085542631_6649f0a995_b.jpg 是 107,它很轻,可能不适用于白色字体。和farm4.staticflickr.com/3912/15197127275_74754c631f_b.jpg 即将到来 97 而且它很黑? (这是在处理 100 个样本时)
    • 这是一个反复试验,但首先你的图像是 1024x683 = 700,000 像素左右,除以 100 并且每 7000 像素有 1 个样本。样本只需要降落在港口的几个这样的灯上,它就会抛出平均值。我会稍微提高一点,尝试 1,000 个样本,看看你会得到什么。计时,看看什么可以满足您的性能需求,
    • 另一种选择,不确定它是否更快是先模糊图像
    • 好的,真棒。如果我们稍微编辑您的函数并制作两个范围 0 - (照片宽度)和 0 - (照片高度)然后随机选择像素怎么样。存储像素并进行 if 语句以确保不再使用它?这肯定会提供更准确的结果吗?
    【解决方案2】:

    您可能会使用一些图像处理算法来检查像素亮度并计算平均图像亮度。

    本文档将帮助您入门:

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

    【讨论】:

    • 我看到有许多不同的计算亮度的公式,我应该使用哪一个?亮度?
    • 这取决于您的确切需求,但我认为 luma 或其他任何方法都可以解决您的问题。
    • 只需选择并调整您认为最容易理解的算法。
    • 我不需要完全理解算法,但结果必须是完美的:)
    • 为了您的目的,任何亮度处理算法都会给出完美而准确的结果。我只是建议为你选择一个更容易理解的算法,因为这样可以更容易实现它,甚至在需要时修改它。
    【解决方案3】:

    如果您希望使用 GD,请尝试使用 imagecolorat 对图像的像素进行采样。您可以确定颜色的 RGB,如 PHP 手册页所示。

    接下来,获取 RGB 样本并使用 basic luminance formula 确定它们的亮度。

    确定您认为的亮与暗的阈值并相应地进行分类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多