Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [funkcja]Szare strony - Żałoba narodowa, Przerobienie plików graficznych na czarno-białe
mdzieciolowski
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 26.02.2008
Skąd: Warszawa

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


Jakiś czas temu, w związku z żałobą narodową, miałem "problem" z szybkim przerobieniem strony na czarno-białą. Nie było problemu z tekstem i kolorami na stronie natomiast zmiana wszystkich plików graficznych nastręczała problemów.
PHP ma co prawda filtr do przerabiania grafik na grayscale, ale w przypadku animowanych gifów powodowało to wyłączenie animicji - widoczna była tylko pierwsza klatka. Z tego też względu napisałem skrypt, który podmienia tabelę kolorów w Gif'e na odcienie szarości, nie naruszając reszty struktury pliku GIF.

Mam nadzieję, że się w najbliższym czasie "nie przyda".

  1. <?php
  2. function Szare($plik){
  3. #########################################################################
  4. #Autor: Marcin Dzięciołowski
  5. #
  6. #########################################################################
  7. #Funkcja Szare zwraca obraz ze zmienioną na szarości tablicą kolorów obrazka
  8. #wymaga podania w zmiennej $plik nazwy pliku
  9. $rozszerzenie=strtolower(substr($plik,strlen($plik)-3,3));
  10. if (file_exists($plik)){
  11. #kontrola istnienia pliku oraz jego rozszerzenia
  12. switch ($rozszerzenie) {
  13. case "gif":
  14. $uchwyt=fopen($plik,"rb");
  15. $tresc = fread($uchwyt, filesize($plik));
  16. ######################################################################
  17. $bin=sprintf("%08b",ord($tresc[10]));
  18. $bin=sprintf("%03s",substr($bin,5,3));
  19. $dlugosc=$bin[0]*4+$bin[1]*2+$bin[2]*1;
  20. $dlugosc=3*pow(2,$dlugosc+1);
  21. ######################################################################
  22. #kontrola ilości używanych kolorów - 3 ostatnie bity jedenastego bajtu
  23. for ($i=13;$i<13+$dlugosc;$i+=3){
  24. #zamiana kolorów uwzględniając jaskrawość kolorów
  25. #w celu przyspieszenia zmniejszono dokładność do jednego miejsca po przecinku
  26. #powinno być: r=0.2117, g=0.7137, b=0.0746
  27. $sr=ord($tresc[$i])*0.2; 
  28. $sr+=ord($tresc[$i+1])*0.7; 
  29. $sr+=ord($tresc[$i+2])*0.1; 
  30. $sr=round($sr);
  31. $tresc[$i]=chr($sr);
  32. $tresc[$i+1]=chr($sr);
  33. $tresc[$i+2]=chr($sr);
  34. }
  35. fclose($uchwyt);
  36. header ("Content-type: image/gif");
  37. echo $tresc;
  38. #zwraca Gif'a
  39. return true;
  40. break;
  41. case "jpg":
  42. $obraz = imagecreatefromjpeg($plik);
  43. if ($obraz && imagefilter($obraz, IMG_FILTER_GRAYSCALE)) {
  44. header ("Content-type: image/jpeg");
  45. imagejpeg ($obraz);
  46. return true;
  47. }else{
  48. return false;
  49. }
  50. break;
  51. case "png":
  52. $obraz = imagecreatefrompng($plik);
  53. if ($obraz && imagefilter($obraz, IMG_FILTER_GRAYSCALE)) {
  54. header ("Content-type: image/png");
  55. imagepng ($obraz);
  56. return true;
  57. }else{
  58. return false;
  59. }
  60. break;
  61. default:
  62. return false;
  63. break;
  64. }
  65. }else{
  66. return false;
  67. }
  68. }
  69. ?>
Powód edycji: poprawienie bbcode
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Cysiaczek
post
Post #2





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




hmm. Nawet fajne - przydatne (nie sprawdziłem jeszcze, czy działa).

Pozdrawiam.
Go to the top of the page
+Quote Post
bim2
post
Post #3





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Prawie działa, nie obsługuje przezroczystości w png'ku (tylko to testowałem). Szkoda (IMG:http://forum.php.pl/style_emoticons/default/sad.gif) Wiem, że to wina GD, no ale nie chodzi ;/ Macie jakieś pomysły na naprawę ? :]
Go to the top of the page
+Quote Post
GrayHat
post
Post #4





Grupa: Zarejestrowani
Postów: 566
Pomógł: 18
Dołączył: 23.08.2003
Skąd: Łomża

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


Nie jest to wydajne rozwiązanie.
Myślę, że da się to zrobić w JavaScripcie po stronie klienta ale jeszcze nie wiem jak (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Da się?
Go to the top of the page
+Quote Post
bim2
post
Post #5





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Pewnie się da, ale czemu ma odpowiadać za to klient. Na słabych kompach może strona wolno chodzić (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Speedy
post
Post #6





Grupa: Zarejestrowani
Postów: 651
Pomógł: 28
Dołączył: 4.12.2004

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


Nie ma sensu robić coś takiego w JS i za każdym uruchomieniem zamulać przeglądarkę. Lepiej przekonwertować obrazki raz. Potem wszytko będzie siedzieć w cache przeglądarki i śmigać normalnie.
Go to the top of the page
+Quote Post
GrayHat
post
Post #7





Grupa: Zarejestrowani
Postów: 566
Pomógł: 18
Dołączył: 23.08.2003
Skąd: Łomża

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


Nie zgodzę się z wami. Wyobraźcie sobie proces przemielenia takiego onetu od strony serwera, a np zrobienie tego po stronie klienta w szybki sposób...
Go to the top of the page
+Quote Post
bim2
post
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


@GrayHat
Ale czemu to użytkownik ma dbać o zmianę wyglądu strony. Ja np. nie chce, żeby było szare wszystko jeśli mój komputer ma za to odpowiadać. Nie lepiej przemielić to raz i wrzucić do cache niżeli mielić miałby każdy user? (a troche ich tam wchodzi).
Go to the top of the page
+Quote Post
mdzieciolowski
post
Post #9





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 26.02.2008
Skąd: Warszawa

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


Dlaczego zrobiłem to po stronie serwera:
1. wyłącznona java script w przeglądarce
2. przeglądarki telefoniczne - palmtopy (moc procesora o ile jest JS)
3. system wyszarzania DirectX działa tylko z IE.

Można co prawda jednorazowo batchem przerobić grafiki, jednak chcę aby zmiana wyglądu nastąpiła po przestawianiu flagi w konfiguracji serwera.

Postaram się jeszcze znaleźć strukturę pliku PNG i zrobić zmianę z przezroczystością.

MD
Go to the top of the page
+Quote Post
bim2
post
Post #10





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Jakbyś mógł, byłbym wdzięczny. Cały mój serwis stoi na png'kach (z przezroczystościami procentowymi gdzieniegdzie) i powiem szczerze że ciężko by było zmieniać to ręcznie. :] Ogólnie niezła robota ^^
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 3.10.2025 - 01:30