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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * 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))); } } } |
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