Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Obliczanie kolorowej powierzchni w pliku graficznym
Forum PHP.pl > Forum > PHP
Grzeniu
Cześć,

nie potrafiłem znaleźć podobnego tematu w Google, więc za wczasu spytam, czy realizacja poniższego pomysłu w PHP ma sens, o ile jest w ogóle wykonalna.

Załóżmy, że mam JPG 200x200px z białym tłem i czerwonym trójkątem na środku. Chciałbym wiedzieć, jaką powierzchnię ma ten trójkąt - może to być przykładowo % całego obrazu. Jedyny pomysł jaki przyszedł mi do głowy, to przelatywanie piksel po pikselu i odczytywanie wartości koloru, później zliczanie.

Docelowo chciałbym znać jaki % (lub powierzchnia) w obrazku jest zajęta przez kolory inne niż tło - kolor tła mogę wziąć z piksela 0x0y.

Czy ktoś ma pomysł jak się do tego zabrać? Czy nie PHP-ędy droga?

Miłęgo,
Grzegorz
Tomplus
Nie ma innego sposobu.
Chyba że poszukujesz skomplikowane algorytmy które dokładnie wizualizują co jest na obrazie.

Jednakże jeżeli wiesz że tło będzie zawsze jednolite np. białe, to możesz wyszukać parametry 3 prostych i w ten sposób stworzyć trójkąt.
trueblue
W Imagick jest gotowa funkcja do tego: http://php.net/manual/en/imagick.getimagehistogram.php
Grzeniu
Cytat(trueblue @ 24.10.2017, 21:16:21 ) *
W Imagick jest gotowa funkcja do tego: http://php.net/manual/en/imagick.getimagehistogram.php


Dzięki, dokładnie tego szukałem. Poniżej wstępny kod, który bierze kolor piksela 0x0y i oblicza %, jaki ten kolor zajmuje w obrazku. W moim przypadku dużo rzeczy jeszcze w kodzie pozmieniam, ale wrzucam, jeżeli w przyszłości ktoś będzie miał podobny pomysł.

  1. <?php
  2. $image = new Imagick("imagick/test.jpg");
  3.  
  4. // okreslenie koloru tla na podstawie piksela x0 y0
  5. $pierwszy_piksel = $image->getImagePixelColor(0, 0) -> getColor();
  6. $kolor_tla = $pierwszy_piksel['r'].$pierwszy_piksel['g'].$pierwszy_piksel['b'];
  7.  
  8. // okreslenie powierzchni calego obrazka
  9. $d = $image->getImageGeometry();
  10. $w = $d['width'];
  11. $h = $d['height'];
  12. $area = $d['width']*$d['height'];
  13.  
  14. echo "rozmiar: ".$d['width']."px × ".$d['height']."px — ".$area;
  15. echo "<br><br>";
  16.  
  17. // <a href="http://php.net/manual/en/imagick.getimagehistogram.php" target="_blank">http://php.net/manual/en/imagick.getimagehistogram.php</a>
  18. $pixels=$image->getImageHistogram();
  19.  
  20. foreach($pixels as $p){
  21. if ($p->getColorCount() > 10){ // pozbywa się pikseli antyaliasingu i artefaktów powstałych przy kompresji PHP
  22. $kolor = $p->getColor()['r'].$p->getColor()['g'].$p->getColor()['b'];
  23. if ($kolor == $kolor_tla){ // znajdz dane koloru tla
  24. echo $kolor." - ".$p->getColorCount()." - ".(100*$p->getColorCount()/$area)."%"; // oblicz % znalazionego koloru
  25. break;
  26. }
  27. }
  28. }
trueblue
A czy wstępna posteryzacja obrazu nie uwolni Cię od sprawdzania czy dany piksel jest artefaktem czy też pochodzi z antialiasingu?
http://php.net/manual/en/imagick.posterizeimage.php
Grzeniu
Cytat(trueblue @ 26.10.2017, 09:21:39 ) *
A czy wstępna posteryzacja obrazu nie uwolni Cię od sprawdzania czy dany piksel jest artefaktem czy też pochodzi z antialiasingu?
http://php.net/manual/en/imagick.posterizeimage.php


Świetna rzecz. Muszę przejrzeć możliwości imagick, bo rzeczywiście przydatnych funkcji multum. Dziękuję za cynk.
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.