Pergunta

Estou fazendo uma conversão ODP-> HTML com PHP.Tenho problemas com o seguinte:

Use o estilo: use-window-font-color propriedade para especificar se o a cor do primeiro plano da janela deve ser tão usado como cor de primeiro plano para um cor de fundo claro e branco para um cor de fundo escura.

(especificação OpenDocument versão 1.0, 15.4.4)

Se eu tiver uma imagem de fundo, como faço para verificar se essa imagem é clara ou escura?

Você tem alguma ideia?

Agradecemos antecipadamente, Levu

Foi útil?

Solução

Achei que esse era um problema bem interessante de resolver, então criei um script rápido para fazer isso.seguindo as outras sugestões fornecidas

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

Outras dicas

você poderia usar algum algoritmo de processamento de imagem que examinaria o brilho do pixel e calcularia o brilho médio da imagem.

este documento irá ajudá-lo a começar:

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

Se você deseja usar o GD, tente usar imagecolorat paraamostra de pixels da imagem.Você pode determinar o RGB da cor conforme mostrado na página de manual do PHP.

Em seguida, pegue a (s) amostra (s) RGB e determine seu brilho usando fórmula de luminância básica .

Determine um limite para o que você considera claro vs. escuro e categorize de acordo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top