www.www.zaachi.com » Blog/Php » PHP Sepia Image

Obrázek v odstínech sépie je vcelku podobný černobílému obrázku, jenom s tím rozdílem, že jeho odstíny nevycházejí z odstínů šedé, ale hnědé barvy. Napsat jednoduchý skript na vytvoření takového obrázku v PHP je vcelku jednoduché.
Nejprve je nutno zavést trochu teorie, jak se barvy sépie počítají. Tón barev sépie vychází z RGB složek barev, které upravuje dle vzorce:
R' = R * 0.393 G * 0.769 B * 0.189 G' = R * 0.349 G * 0.686 B * 0.168 B' = R * 0.272 G * 0.534 B * 0.131
Dle těchto rovnic můžeme následně počítat nové barvy a v paletě barev v obraze je nahrazovat:
//v cyklu projdeme celou paletu barev
for ( $i = 0; $i < $total; $i++ ) {
//postupne si vracime barvu z indexu
$col = ImageColorsForIndex( $img, $i );
//vypocitame si nove barvy
$red = ( $col['red'] * 0.393 + $col['green'] * 0.769 + $col['blue'] * 0.189 );
$green = ( $col['red'] * 0.349 + $col['green'] * 0.686 + $col['blue'] * 0.168 );
$blue = ( $col['red'] * 0.272 + $col['green'] * 0.534 + $col['blue'] * 0.131 );
Ostatní operace s obrázkem jsou již triviální záležitostí. Celý skript může vypadat zjednodušeně takto:
function MakeSepia( &$img ){
//Prevedeme barevnĂ˝ obraz na barevnou paletu barev
ImageTrueColorToPalette( $img, true, 255 );
//zjistime si pocet barev v patele barev obrazu
$total = ImageColorsTotal( $img );
//v cyklu projdeme celou paletu barev
for ( $i = 0; $i < $total; $i++ ) {
//postupne si vracime barvu z indexu
$col = ImageColorsForIndex( $img, $i );
//vypocitame si nove barvy
$red = ( $col['red'] * 0.393 + $col['green'] * 0.769 + $col['blue'] * 0.189 );
$green = ( $col['red'] * 0.349 + $col['green'] * 0.686 + $col['blue'] * 0.168 );
$blue = ( $col['red'] * 0.272 + $col['green'] * 0.534 + $col['blue'] * 0.131 );
//jednoducha kontrola, zda muzeme
$red = ( $red > 255 ? 255 : $red );
$green = ( $green > 255 ? 255 : $green );
$blue = ( $blue > 255 ? 255 : $blue );
//ulozime barvu do obrazku
ImageColorSet( $img, $i, $red, $green, $blue );
}
}
Volání funkce provedeme například:
$img = imagecreatefromjpeg('img.jpg');
header('Content-type: image/jpeg');
MakeSepia($img);
imagejpeg($img);
Výsledný obrázek může vypadat takto:
