Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [funkcja]Szare strony - Żałoba narodowa
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
mdzieciolowski
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. ?>
Cysiaczek
hmm. Nawet fajne - przydatne (nie sprawdziłem jeszcze, czy działa).

Pozdrawiam.
bim2
Prawie działa, nie obsługuje przezroczystości w png'ku (tylko to testowałem). Szkoda sad.gif Wiem, że to wina GD, no ale nie chodzi ;/ Macie jakieś pomysły na naprawę ? :]
GrayHat
Nie jest to wydajne rozwiązanie.
Myślę, że da się to zrobić w JavaScripcie po stronie klienta ale jeszcze nie wiem jak tongue.gif
Da się?
bim2
Pewnie się da, ale czemu ma odpowiadać za to klient. Na słabych kompach może strona wolno chodzić smile.gif
Speedy
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.
GrayHat
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...
bim2
@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).
mdzieciolowski
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
bim2
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 ^^
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.