Program zaliczony, podaje zrodla, moze kiedys sie komus przydadza, algorytm kodowania:
<?
$i=2; // w ile bitow wstawiac, od 1 do 8
$im=imagecreatefrompng('1.png');
$ix=imagesx($im);$iy=imagesy($im);
$s='';for
($z=0;$z<strlen
($t);$z++){$s.=str_pad(decbin(ord
($t[$z])),8,'0',STR_PAD_LEFT
);}
$c=(256-pow(2,$i));
for($a=0;$a<strlen($s)/$i/3;$a++){
$x=$a%$ix;
$rgb=imagecolorat($im,$x,$y);
imagesetpixel($im,$x,$y,($r<<16)+($g<<8)+$b);
}
imagepng($im,'2.png');
?>
Algorytm dekodowania
<?
// kod odpowiedzialny za dekodowanie tekstu w obrazku:
// pobranie pierwszych 10 bajtow informacji z obrazka oraz stopien upakowania
$d = 10;
// pobierz plik
$im=@imagecreatefrompng('2.png'); //odczytuje obraz z adresu URL
if (!$im) //jeśli nie ma obrazu lub nie jest PNG wyswietl blad
{
echo \"<center>Niestety wystąpił błąd podczas odczytu. Upewnij się, czy wczytujesz obraz PN </CENTER>\";
exit();
}
/***********************************************************************/
$ix=imagesx($im);$iy=imagesy($im);
$rgb=imagecolorat($im,0,0);
$i=(($rgb>>16)&1)*4+(($rgb>>8)&1)*2+($rgb&1)+1; //odczyt pierwszego piksela, w którym mamy
//stopien upakowania jeśli 000, to $i=1, 111 = $i=8
$c=pow(2,$i)-1;
$s='';
for($a=0;$a<ceil($d*8/$i/3);$a++){ // odczyt jak w przypadku kodowania z pominieciem
//pierwszego piksela
$x=($a+1)%$ix;
$y=floor(($a+1)/$ix);
$rgb=imagecolorat($im,$x,$y);
$r=decbin(($rgb>>16)&$c);
$g=decbin(($rgb>>8)&$c);
$b=decbin($rgb&$c);
$s.=str_pad($r,$i,'0',STR_PAD_LEFT).str_pad($g,$i,'0',STR_PAD_LEFT).str_pad($b,$i,'0',STR_PAD_LEFT);
// w s przechowujemy nasze zakodowane informacje, z lewej strony wypelniamy zerami
}
$t='';
for($z=0;$z<$d;$z++) {$t.=chr(bindec(substr($s,$z*8,8)));} //zamien w kolejne bajty na liczbe dziesietna
//i pozniej ta liczbe na znaki
/***********************************************************************/
// sprawdza, czy w obrazie jest informacja na podstawie tego, czy pierwsze 10 bajt
w to liczba
$t+=0; //konwersja z string na int
if(!is_integer($t)) //sprawdza czy jest liczba
{
echo \"<center>W tym obrazie nie jest zakodowana infromacja</CENTER>\";
exit();
}
/***********************************************************************/
// algorytm dekodowania informacji - analogicznie, jak deszyfracja pierwszych 10 bajtow
$d=$t+10; // dlugosc calej zakodowanej infromacji
$s='';
for($a=0;$a<ceil($d*8/$i/3);$a++){
$x=($a+1)%$ix;
$y=floor(($a+1)/$ix);
$rgb=imagecolorat($im,$x,$y);
$r=decbin(($rgb>>16)&$c);
$g=decbin(($rgb>>8)&$c);
$b=decbin($rgb&$c);
$s.=str_pad($r,$i,'0',STR_PAD_LEFT).str_pad($g,$i,'0',STR_PAD_LEFT).str_pad($b,$i,'0',STR_PAD_LEFT);
}
$t='';
for($z=0;$z<$d;$z++){$t.=chr(bindec(substr($s,$z*8,8)));}
// w $t mamy cala informacje + 10 bajtow dlugosci na samym poczatku, wycinamy 10 p
erwszych liczb
$t=substr($t,10);
// zapis do pliku
// file_put_contents('2.txt',$t); // tylko dla >= php 5.0
$p=fopen('2.txt','w');
fputs($p,$t);
fclose($p);
?>