Ha PHP-GD-vel készítesz képeket és egyszerűbb filtereket (szürkeárnyalatosítás, blur, színárnyalat-eltolás) szeretnél használni jól jöhet ez a kód. Ezen kívül a negyedik függvénnyel meghatározhatod két RGB színkóddal megadott szín távolságát.
<?php
/**
* ImageDesaturate - Szürkeárnyalatossá teszi a képet
*
* A kép összes pixelét szürkeárnyalatossá teszi: minden pixel RGB-kódjának elemeit módosítja a három elem átlagára.
* Példa: RGB(255, 0, 0) [piros] => (255 + 0 + 0) / 3 = 85, így az új szín RGB(85, 85, 85) lesz.
* @param resource image
* @return void
*/
function imagedesaturate($image) {
if(!Is_resource($image)) {
trigger_error('Given parameter is not a valid image resource!');
return;
}
for($x = 0; $x < imagesx($image); $x++) {
for($y = 0; $y < imagesy($image); $y++) {
$color = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$color = array_average($color);
imagesetpixel($image, $x, $y, imagecolorallocate($image, $color, $color, $color));
}
}
}
/**
* ImageHueSaturation - Színárnyalat-eltolás
*
* A kép összes pixelénak színét eltolja.
* Az eltolás mértéke (második, harmadik ill. negyedik paraméter, sorra az RGB elemei) lehet negatív is,
* így a fekete színhez közeledik a pixel színe.
* @param resource image
* @param [int red]
* @param [int green]
* @param [int blue]
* @return void
*/
function imagehuesaturation($image, $red = 0, $green = 0, $blue = 0) {
if(!Is_resource($image)) {
trigger_error('Given parameter is not a valid image resource!');
return;
}
if($red == 0 && $green == 0 && $blue == 0) {
return;
}
for($x = 0; $x < imagesx($image); $x++) {
for($y = 0; $y < imagesy($image); $y++) {
$color = imagecolorsforindex($image, imagecolorat($image, $x, $y));
$color['red'] = $color['red'] + $red;
if($color['red'] < 0) { $color['red'] = 0; }
elseif($color['red'] > 255) { $color['red'] = 255; }
$color['green'] = $color['green'] + $greeb;
if($color['green'] < 0) { $color['green'] = 0; }
elseif($color['green'] > 255) { $color['green'] = 255; }
$color['blue'] = $color['blue'] + $blue;
if($color['blue'] < 0) { $color['blue'] = 0; }
elseif($color['blue'] > 255) { $color['blue'] = 255; }
imagesetpixel($image, $x, $y, imagecolorallocate($image, $color['red'], $color['green'], $color['blue']));
}
}
}
/**
* ImageBlur - Kép elmosása
*
* A képet mossa el. A kép összes pixelét módosítja a tőle Radius távolságon belül levő pixel színeinek átlagára.
* @param resource image
* @param [int radius = 2]
* @return void
*/
function imageblur($image, $radius = 2) {
if(!Is_resource($image)) {
trigger_error('Given parameter is not a valid image resource!');
return;
}
if($radius == 0) {
return;
}
for($x = 0; $x < imagesx($image); $x++) {
for($y = 0; $y < imagesy($image); $y++) {
$red = $green = $blue = array();
for($xi = ($x - $radius); $xi <= ($x + $radius); $xi++) {
if($xi < 0 || $xi > imagesx($image)) {
continue;
}
for($yi = ($y - $radius); $yi <= ($y + $radius); $yi++) {
if($yi < 0 || $yi > imagesy($image)) {
continue;
}
list($red[], $green[], $blue[]) = array_values(imagecolorsforindex($image, imagecolorat($image, $xi, $yi)));
}
}
$red = array_average($red);
$green = array_average($green);
$blue = array_average($blue);
imagesetpixel($image, $x, $y, imagecolorallocate($image, $red, $green, $blue));
}
}
}
/**
* ImageColorDistance - Két RGB színkód közti távolságot adja meg
*
* A függvény a megadott két RGB kód közötti távolságot adja vissza úgy, mintha azok egy 3 dimenziós
* koordináta-rendszerben lennének ábrázolva.
* Így - a Pitagorasz-tétel miatt - a két pont távolsága a két kód megfelelő koordinátáinak különbségének négyzetösszegének gyöke.
* d = sqrt( (R1 - R2)^2 + (G1 - G2)^2 + (B1 - B2)ˇ2 )
* A visszakapott érték mindenképp 0 és 441.67295593 között lesz
* Ha a harmadik paramétert true-ra állítjuk, az értéket egész számként kapjuk vissza
* @param array RGB1
* @param array RGB2
* @param [bool getAsInt = true]
* @return float distance
*/
function imagecolordistance($rgbFrom, $rgbTo, $getAsInt = false) {
$red = $green = $blue = array();
if(!Is_array($rgbFrom) || count($rgbFrom) < 3 || !Is_array($rgbTo) || count($rgbTo) < 3) {
return false;
}
list($red[], $green[], $blue[]) = array_values($rgbFrom);
list($red[], $green[], $blue[]) = array_values($rgbTo);
$distance = (sqrt(pow($red[0] - $red[1], 2) + pow($green[0] - $green[1], 2) + pow($blue[0] - $blue[1], 2)));
if($getAsInt) {
return (int)$distance;
}
return $distance;
}
/**
* Array_average - Egy tömb elemeinek átlagát adja vissza
* @param array Array
* @return int Average
*/
function array_average($array) {
if(!Is_array($array)) {
return false;
}
return (int)(array_sum($array) / count($array));
}
Szerkesztve: 2007. április. 23: Egy invertáló függvény
/**
* ImageInvert - Invertálja a kép színet
*
* Invertálja (ellentettjére változtatja) a képet.
* @param resource Image
* @param [bool getAsInt = true]
* @return float distance
*/
function imageinvert($image) {
for($x = 0; $x < imagesx($image); $x++) {
for($y = 0; $y < imagesy($image); $y++) {
list($red, $green, $blue) = array_values(imagecolorsforindex($image, imagecolorat($image, $x, $y)));
imagesetpixel($image, $x, $y, imagecolorallocate($image, (255 - $red), (255 - $green), (255 - $blue)));
}
}
}
Harder
Profil
Korábbi hozzászólások (4)
A régi blogon érkezett hozzászólások archívuma. Új hozzászólást már nem lehet írni.
Az utolsó (invertáló) függvény gyorsabban futna, ha az értékeket nem tömbszerűen nyernéd ki, hanem egy imagecolorat($im,$x,$y) függvény 24 bites visszatérési értékén végeznél invertálást, és az imagesetpixel() paraméterezésében 8 bitenkénti eltolással nyernéd ki az egyes színcsatornák értékeit.
Így:
$c = ~imagecolorat($im,$x,$y);
imagesetpixel($im,$x,$y,imagecolorallocate($im,$c & 0xFF,($c >> 8) & 0xFF,($c >> 16) & 0xFF));
Mivel minden pixelre el kell végezni a műveletet, minden ezredmásodperc számít a végrehajtásban.
A php.net-en egy hozzászólásban említik csak azt, hogy az azonosítóból közvetlenül megkaphatóak a színek, szóval ezt nem tekinthetjük dokumentált működésnek, így nem erőltetném... (különösen, hogy "... képpont színének indexével tér vissza ...", ami indexelt képeknél (nem csak gif, png ugyanúgy lehet indexelt!), 0-256 közti szám)
De ha csak true color képekről beszélünk (és 2008-ban miért ne? :) ), akkor jogos.
BlackY
Hogyan kell ezt használni? :)
Mert ha beírtam ezt:
imageinvert('01.jpg');
nem működik! Valaki segítsen! :)
Üdv: Ádám
imageinvert(imagecreatefromstring(file_get_contents('01.jpg')));
BlackY
Van hozzáfűznivalód? Írj nekem közvetlenül.
Kapcsolat