Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][gd] Określanie czy obrazek jest jasny czy ciemny
Forum PHP.pl > Forum > PHP
licki
Witam!
Obecnie piszę w PHP skrypt który przy pomocy biblioteki GD na obrazek jpeg nadkłada logo serwisu z pliku png. Jako, że logo ma kanały przezroczystości, aby to dobrze wyglądało potrzebne są dwie wersje - logo jasne i ciemne do wstawiania na kolejno ciemnych i jasnych zdjęciach.

Mam teraz pytanie - czy przychodzą Wam do głowy jakieś rozwiązania jak sprawdzić czy miejsce w którym ma być wstawione logo jest jasne czy ciemne? Myślałem o sprawdzeniu wszystkich pixeli po kolei i porównaniem ich do jakiejś wartości granicznej, a następnie zestawienie ilości pixeli ciemnych i jasnych - których będzie więcej taki jest obrazek (ciemny albo jasny), ale nie wiem czy nie angażuje to zbyt dużych środków. Może macie jakieś sugestie albo lepsze pomysły na ten problem?

Pozdrawiam
dotangelo
Tak na twardo, to przychodzi mi na myśl iteracja po pixelach i sprawdzanie czy dany pixel jest bliżej jasnego koloru czy ciemnego.

Ale na bank już ktoś miał taki problem i wymyślił cos lepszego smile.gif
licki
Cytat(dotangelo @ 24.07.2009, 13:11:21 ) *
Tak na twardo, to przychodzi mi na myśl iteracja po pixelach i sprawdzanie czy dany pixel jest bliżej jasnego koloru czy ciemnego.

Ale na bank już ktoś miał taki problem i wymyślił cos lepszego smile.gif

Też o tym myślałem, logo ma 26 x 137 pixeli czyli trzeba sprawdzić kolor ~3500 punktów. W sumie to nie duży problem, tylko czy nie zeżre to znacznie pamięci procesora jeśli mamy zabawę z około ~10k obrazków winksmiley.jpg

Chociaż czasem najprostsze rozwiązania są najlepsze smile.gif

Może komuś się przyda:
  1. <?php
  2. $stamp = imagecreatefrompng('stamp-dark.png');
  3.    $im = imagecreatefromjpeg($path . $filename);
  4.  
  5.    $marge_right = 0;
  6.    $marge_bottom = 2;
  7.    $sx = imagesx($stamp);
  8.    $sy = imagesy($stamp);
  9.  
  10.    $darkness = 0;
  11.    for($x = imagesx($im) - $sx - $marge_right;$x<imagesx($im) - $marge_right;$x++){
  12.        for($y = imagesy($im) - $sy - $marge_bottom;$y<=imagesy($im) - $marge_bottom;$y++){
  13.            $rgb = imagecolorat($im, $x, $y);
  14.            
  15.            $r = ($rgb >> 16) & 0xFF;
  16.            $g = ($rgb >> 8) & 0xFF;
  17.            $b = $rgb & 0xFF;
  18.                    
  19.            if(($r+$g+$b) > 384) $darkness++; else $darkness--;    
  20.        }
  21.    }
  22.    
  23.    imagedestroy($stamp);
  24.    
  25.    if($darkness>0) {
  26.        $stamp = imagecreatefrompng('stamp-dark.png');
  27.        } else {
  28.        $stamp = imagecreatefrompng('stamp-light.png');    
  29.        }
  30.  
  31.    imagecopy($im, $stamp, imagesx($im) - $sx - $marge_right, imagesy($im) - $sy - $marge_bottom, 0, 0, imagesx($stamp), imagesy($stamp));
  32.  
  33.    //header('Content-type: image/jpeg');
  34.    imagejpeg($im, $path . 'converted-' . $filename);
  35. ?>
michaJlS
to nie sprawdzaj wszystkich punktów, tylko wylosuj 30.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.