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

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.

  1. moikboymoikboy.freeblog.hu

    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.

  2. BlackY

    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

  3. Wilzi

    Hogyan kell ezt használni? :)
    Mert ha beírtam ezt:

    imageinvert('01.jpg');

    nem működik! Valaki segítsen! :)

    Üdv: Ádám

  4. BlackY

    imageinvert(imagecreatefromstring(file_get_contents('01.jpg')));

    BlackY

Van hozzáfűznivalód? Írj nekem közvetlenül.

Kapcsolat