Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript][PHP][grafika] Detekcja barwy zdjęcia (kolor czy monochromatyczne?).
suny79
post 10.03.2010, 00:35:49
Post #1





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 9.03.2010

Ostrzeżenie: (0%)
-----


Witam,

szukam i szukam i nie mogę się doszukać, postanowiłem więc zasięgnąć tu pomocy. Otóż potrzebuję szybko sprawdzić w php i javascript czy zdjecie wgrywane na serwer jest czarnobiałe czy kolorowe. Próbowałem kilku funkcji z rodziny image..
- imagecolorexact
- imagecolorstotal itp.

Nic nie udało mi się osiągnąć. Czy macie jakieś doświadczenie w tym temacie?

Z góry dziękuję za pomoc.
Włodek.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
ayeo
post 10.03.2010, 03:41:14
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

Ostrzeżenie: (0%)
-----


Witam!

Nie wiem czy to najlepsze rozwiązanie (w zasadzie wiem, że nie), ale... Możesz lecieć po kolei po wszystkich pikselach i sprawdzać czy R == G == B. Jeśli nie to zdjęcie jest kolorowe biggrin.gif

Pozdrawiam!


--------------------
Go to the top of the page
+Quote Post
suny79
post 10.03.2010, 08:28:58
Post #3





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 9.03.2010

Ostrzeżenie: (0%)
-----


To ciekawe, nie wiem na ile wydajne, ale jeśli nie ma innej szybszej metody to przetestuję tą. Ew. może by szybko z resizować obrazek do np. 100x100 i wykonać te czynności na miniaturce? Jeśli obrazek ma np. rozdz. 800x600 to już się robi prawie pół miliona operacji....

Na pewno musi istnieć jakaś szybka metoda smile.gif

Pozdrawiam,
Włodek.
Go to the top of the page
+Quote Post
thek
post 10.03.2010, 08:57:22
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Co masz na myśli pod pojęciem "czarno-białe"? Że faktycznie ma ono tylko te dwa kolory, czy może jeszcze odcienie szarości? Jeśli to pierwsze to Masz tylko 2 kolory w całym obrazie. Jeśli to drugie to maksymalnie 256, przy czym ich rozkład jako RGB jest taki jak wspomniany przez ayeo. Skala szarości charakteryzuje się bowiem tym, że wszystkie składowe koloru mają tę samą wartość. Możesz więc nawet, jeśli chcesz, na podstawie analizy kolorów obrazu łatwo zbudować histogram dzięki temu.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
woodzu
post 10.03.2010, 11:24:26
Post #5





Grupa: Zarejestrowani
Postów: 37
Pomógł: 3
Dołączył: 14.12.2006
Skąd: /usr/bin/php

Ostrzeżenie: (0%)
-----


Powinienieś zainteresować się funkcjami Imagick::getImageColorspace ( ewentualnie Imagick::getImageDepth)

  1. Imagick::getImageColorspace

może zwrócić:

  • 0 - UndefinedColorspace
  • 1 - RGBColorspace
  • 2 - GRAYColorspace
  • 3 - TransparentColorspace
  • 4 - OHTAColorspace
  • 5 - LABColorspace
  • 6 - XYZColorspace
  • 7 - YCbCrColorspace
  • 8 - YCCColorspace
  • 9 - YIQColorspace
  • 10 - YPbPrColorspace
  • 11 - YUVColorspace
  • 12 - CMYKColorspace
  • 13 - sRGBColorspace
  • 14 - HSBColorspace
  • 15 - HSLColorspace
  • 16 - HWBColorspace


ciebie interesuje nr.2
Go to the top of the page
+Quote Post
thek
post 10.03.2010, 12:28:28
Post #6





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Woodzu, jest tylko jedno ALE. Nawet jeśli obraz będzie w skali szarości, ale zapisany jako RGBColorspace to i tak pokaże mu w wyniku 1, a nie 2 zapewne winksmiley.jpg A my tu mówimy chyba o rozpoznaniu już niezależnym od colorspace wpisanym do pliku. Nie zaś wynikającym tego, że paleta kolorów jest zapisana w pliku jako określony rodzaj. A przynajmniej ja tam mniemam.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
woodzu
post 10.03.2010, 15:17:50
Post #7





Grupa: Zarejestrowani
Postów: 37
Pomógł: 3
Dołączył: 14.12.2006
Skąd: /usr/bin/php

Ostrzeżenie: (0%)
-----


ok racja, w sumie można tego użyć tylko na wstępie żeby niepotrzebnie nie wywołać iteracji po pikselach kiedy zdjęcie jest i tak monochromem, odciążymy tym trochę CPU, jesli zwróci fase wtedy np. sprawdzania ok 20 losowych pikseli

co wy na to?

przykład na:
http://www.php.net/manual/en/function.imagecolorat.php#71444
Go to the top of the page
+Quote Post
thek
post 10.03.2010, 16:10:23
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Można robić losowe piksele, ale ich liczba musi być większa niż 20, bo a nuż będziesz miał pecha i trafisz dokładnie w 20 o skali szarości. W każdym razie sprawdzenie monochroma na starcie głupim pomysłem nie jest, o ile ma się magika jako rozszerzenie zainstalowane smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
woodzu
post 10.03.2010, 16:46:28
Post #9





Grupa: Zarejestrowani
Postów: 37
Pomógł: 3
Dołączył: 14.12.2006
Skąd: /usr/bin/php

Ostrzeżenie: (0%)
-----


widziałem kiedyś funkcje w C++, która robi dokładnie to o co kolega pytał... bede miał troche czasu to poszperam jeszcze

edit.

znajdę ją jeżeli ktoś będzie zainteresowany żeby sobie napisać taki program w C++

na razie znalazłem gotowe rozwiązanie które używa GDLib http://www.roseindia.net/tutorial/php/phpg...sgrayscale.html

Ten post edytował woodzu 10.03.2010, 16:53:25
Go to the top of the page
+Quote Post
suny79
post 10.03.2010, 17:51:06
Post #10





Grupa: Zarejestrowani
Postów: 23
Pomógł: 0
Dołączył: 9.03.2010

Ostrzeżenie: (0%)
-----


Witam i dziękuję wszystkim za pomoc.

Potestowałem ten skrypt http://www.roseindia.net/tutorial/php/phpg...sgrayscale.html

i działa bardzo dobrze. Wykrywa zdjęcia kolorowe i czarnobiałe tj. w skali szarości.

Zbyt duże pliki (nie wiem, dokładnie gdzie jest granica, ale dostałem błąd dla pliku 300KB) nie są procesowane ze względu na brak pamięci dla usera serwera php. Poradziłem sobie tak, że robię resize w locie i wykonuje skrypt dla zdjęć pomniejszonych. Działa pięknie. Przykład dla zdjęcia 2,8MB:

The image is grayscale.
Executed in 0.550637960434 seconds

Taki performance mi jak najbardziej odpowiada smile.gif


Pozdrawiam,
Włodek.
Go to the top of the page
+Quote Post
thek
post 10.03.2010, 17:54:16
Post #11





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




No przecież to dokładnie to co jest w jednym z pierwszych postów smile.gif Sprawdzenie wszystkich pikseli obrazu pod kątem równości R, G i B. Konkretnie to sprawdza ile jest takich co mają równe pary R = G i R = B i w takim wypadku inkrementuje licznik. Jeśli na końcu licznik będzie równy wysokość razy szerokość to jest to skala szarości. Tak więc nic więcej niż już proponowaliśmy smile.gif


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 06:50