Background image dark or light?

2019-02-01 23:29发布

问题:

I'm doing a ODP->HTML conversion with PHP. I have problems with the following:

Use the style:use-window-font-color property to specify whether or not the window foreground color should be as used as the foreground color for a light background color and white for a dark background color.

(OpenDocument specification version 1.0, 15.4.4)

If i have a background image, how do i check, if this image is light or dark?

Do you have any ideas?

Thanks in advance, Levu

回答1:

I thought this was quite an interesting problem to solve, so i hacked up a quick script to do it. following the other suggestions provided

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


回答2:

you could possibly use some image processing algorithm that would examine the pixel brightness and calculate mean image brightness.

this document will get you started:

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



回答3:

If you're looking to use GD, trying using imagecolorat to sample pixels of the image. You can determine the RGB of the color as shown on the PHP man page.

Next, take the RGB sample(s) and determine their brightness using a basic luminance formula.

Determine a threshold for what you consider light vs. dark and categorize accordingly.