Search code examples
phpgdopendocument

Background image dark or light?


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


Solution

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