Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][GD]Sprawdzanie czy obrazek zawiera kolor czarny
Forum PHP.pl > Forum > PHP
moto0095
Witam, tak jak w temacie potrzebuję sprawdzić czy obrazek zawiera kolor czarny.
lukaskolista
Ja potrzebuje pieniedzy smile.gif a tak na powaznie poza przeskanowaniem obrazka pixel po pixelu nie przychodzi mi nic innego do glowy. Poza tym kolor czarny to cala gama odcieni ktorych zakres trzeba gdzies zdefiniowac.
Kshyhoo
Skrypt wylicza ilość procentową kolorów, przerób sobie go do własnych potrzeb...
  1. <?php
  2. function rgb2hsl($r, $g, $b) {
  3. $r /= 255;
  4. $g /= 255;
  5. $b /= 255;
  6. $min = min($r, $g, $b);
  7. $max = max($r, $g, $b);
  8. $delta = $max-$min;
  9. $l = ($max+$min)/2;
  10. if ($delta==0) {
  11. $h = 0;
  12. $s = 0;
  13. } else {
  14. if ($l<0.5) $s = $delta/($max+$min);
  15. else $s = $delta/(2-$max-$min);
  16. $dr = (($max-$r)/6 + $delta/2)/$delta;
  17. $dg = (($max-$g)/6 + $delta/2)/$delta;
  18. $db = (($max-$b)/6 + $delta/2)/$delta;
  19. if ($r==$max) $h = $db-$dg;
  20. else if ($g==$max) $h = 1/3+$dr-$db;
  21. else if ($b==$max) $h = 2/3+$dg-$dr;
  22. if ($h<0) $h +=1;
  23. if ($h>1) $h -=1;
  24. }
  25. return array(round($h*359), round($s*359), round($l*359));
  26. }
  27.  
  28. $plik = "obrazek.jpg"; // obrazek
  29.  
  30. $im = imagecreatefromjpeg($plik);
  31. $szerokosc = imagesx($im);
  32. $wysokosc = imagesy($im);
  33. for ($x=0;$x<$szerokosc;$x++) {
  34. for ($y=0;$y<$wysokosc;$y++) {
  35. $c = imagecolorsforindex($im, imagecolorat($im, $x, $y));
  36. list($h, $s, $l) = rgb2hsl($c['red'], $c['green'], $c['blue']);
  37. if ($h>=0 and $h<=20) $czerwony++;
  38. if ($h>20 and $h<=45) $pomaranczowy++;
  39. if ($h>45 and $h<=60) $zolty++;
  40. if ($h>60 and $h<=160) $zielony++;
  41. if ($h>160 and $h<=190) $turkusowy++;
  42. if ($h>190 and $h<265) $niebieski++;
  43. if ($h>265 and $h<335) $rozowy++;
  44. if ($h>335) $czerwony++;
  45. if ($c['red']+ $c['green']+ $c['blue']<30) $czarny++;
  46. if ($c['red']+ $c['green']+ $c['blue']>235*3) $bialy++;
  47. }
  48. }
  49. $pikseli = $szerokosc*$wysokosc;
  50. echo "czerwony ~ ".round($czerwony/$pikseli*100)."%<br />";
  51. echo "pomaranczowy ~ ".round($pomaranczowy/$pikseli*100)."%<br />";
  52. echo "żółty ~ ".round($zolty/$pikseli*100)."%<br />";
  53. echo "zielony ~ ".round($zielony/$pikseli*100)."%<br />";
  54. echo "turkusowy ~ ".round($turkusowy/$pikseli*100)."%<br />";
  55. echo "niebieski ~ ".round($niebieski/$pikseli*100)."%<br />";
  56. echo "różowy ~ ".round($rozowy/$pikseli*100)."%<br />";
  57. echo "biały ~ ".round($bialy/$pikseli*100)."%<br />";
  58. echo "czarny ~ ".round($czarny/$pikseli*100)."%<br />";
  59. ?>

1. Piksel po pikselu odczytujesz składowe RGB z obrazka.
2. Konwertujesz na system HSL, gdzie składowa H określa kolor w zakresie od 0 do 359 (system RGB nie nadaje się).
Kazaan
Cytat(Kshyhoo @ 13.10.2011, 10:39:02 ) *
2. Konwertujesz na system HSL, gdzie składowa H określa kolor w zakresie od 0 do 359 (system RGB nie nadaje się).



Mozesz rozwinąć myśl questionmark.gif dlaczego RGB sie do tego nie nadaje? z góry dzieki
Kshyhoo
Co mogą te dwa systemy:
RGB:
numer koloru = R * 256^2 + G * 256 + B

HSL:
H: Hue – odcień, barwa, o wartościach z przedziału: od 0 do 360 stopni.
S: Saturation – nasycenie koloru, z przedziału 0...1 albo 0...100%.
L: Lightness – średnie światło białe, z przedziału 0...1 albo 0...100%.

Wnioski wyciągnij sam...
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.