Pregunta

Estoy haciendo una conversión ODP-> HTML con PHP. Tengo problemas con lo siguiente:

Use el estilo: use la propiedad de color ventana de ventana para especificar si el color de primer plano de la ventana debe ser tan utilizado como el color de primer plano para un color de fondo claro y blanco para un color de fondo oscuro.

(Especificación OpenDocument versión 1.0, 15.4.4)

Si tengo una imagen de fondo, ¿cómo lo verifico, si esta imagen es ligera o oscura?

¿Tienes alguna idea?

Gracias de antemano, Levu

¿Fue útil?

Solución

Pensé que este era un problema bastante interesante para resolver, así que pirateé un guión rápido para hacerlo. siguiendo las otras sugerencias proporcionadas

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

Otros consejos

Posiblemente podría usar algún algoritmo de procesamiento de imágenes que examinaría el brillo del píxel y calcularía el brillo de la imagen media.

Este documento te hará comenzar:

http://www.kweii.com/site/color_theory/2007_lv/brightnesscalculation.pdf

Si está buscando usar GD, intentando usar imagecolorat Para probar píxeles de la imagen. Puede determinar el RGB del color como se muestra en la página PHP MAN.

A continuación, tome las muestras RGB y determine su brillo utilizando un Fórmula de luminancia básica.

Determine un umbral para lo que considera la luz frente a la oscuridad y clasifica en consecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top