Egyszerűbb képmanipuláló függvények, filterek

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)));
		}
	}
}

4 HOZZÁSZÓLÁS

  1. 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. 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. Hogyan kell ezt használni? :)
    Mert ha beírtam ezt:

    imageinvert(’01.jpg’);

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

    Üdv: Ádám

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét