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".
<?php
function Szare($plik){
#########################################################################
#Autor: Marcin Dzięciołowski
#
#########################################################################
#Funkcja Szare zwraca obraz ze zmienioną na szarości tablicą kolorów obrazka
#wymaga podania w zmiennej $plik nazwy pliku
#kontrola istnienia pliku oraz jego rozszerzenia
switch ($rozszerzenie) {
case "gif":
$uchwyt=fopen($plik,"rb"); ######################################################################
$bin=sprintf("%08b",ord
($tresc[10
])); $dlugosc=$bin[0]*4+$bin[1]*2+$bin[2]*1;
$dlugosc=3*pow(2,$dlugosc+1);
######################################################################
#kontrola ilości używanych kolorów - 3 ostatnie bity jedenastego bajtu
for ($i=13;$i<13+$dlugosc;$i+=3){
#zamiana kolorów uwzględniając jaskrawość kolorów
#w celu przyspieszenia zmniejszono dokładność do jednego miejsca po przecinku
#powinno być: r=0.2117, g=0.7137, b=0.0746
$sr=ord($tresc[$i])*0.2;
$sr+=ord($tresc[$i+1])*0.7;
$sr+=ord($tresc[$i+2])*0.1;
$tresc[$i]=chr($sr);
$tresc[$i+1]=chr($sr);
$tresc[$i+2]=chr($sr);
}
header ("Content-type: image/gif"); #zwraca Gif'a
return true;
break;
case "jpg":
$obraz = imagecreatefromjpeg($plik);
if ($obraz && imagefilter($obraz, IMG_FILTER_GRAYSCALE)) {
header ("Content-type: image/jpeg"); imagejpeg ($obraz);
return true;
}else{
return false;
}
break;
case "png":
$obraz = imagecreatefrompng($plik);
if ($obraz && imagefilter($obraz, IMG_FILTER_GRAYSCALE)) {
header ("Content-type: image/png"); imagepng ($obraz);
return true;
}else{
return false;
}
break;
default:
return false;
break;
}
}else{
return false;
}
}
?>
Powód edycji: poprawienie bbcode