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)));
		}
	}
}
Kapcsolódó bejegyzések:
  • Color: az adott elem színét adhatjuk meg vele. Pl.H1 { color: blue } H2 { color: #0000ff } H3 { color: #0c0 }Background Color: az adott elem háttérsz …

  • Ez a kódrészlet nem egy tutorial, csak emlékeztetőként rakom fel a lapra, hogy könnyebben megtaláljam ha épp szükségem lenne rá. :)IE6 és IE7 CSS hack* …

  • A tutorial segít megtanulni, hogy hogyan adhatunk a képeinknek egy adott színhatást, tónust. A technikával olyan egyedi tónust adhatunk a képeinknek, amilyet csa …

  • Egy tag-hez készíthetünk több különböző, ún. stílusosztályt is: a tag neve után egy ponttal elválasztva adjuk meg az osztály nevét (módosítót), pl.code.ht …

  • Az alábbi videó tutorial eredménye inkább Sin City effektként lehet ismerős sokak számára … egyetlen színt fogunk meghagyni a videóban a többi fekete-fehér mar …

A cikket beküldte: BlackY ()

4 hozzászólás

  1. moikboy says:

    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 says:

    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 says:

    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 says:

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

    BlackY

Szólj hozzá
a Egyszerűbb képmanipuláló függvények, filterek c. bejegyzéshez

- Engedélyezett HTML elemek: <a> <em> <strong> <ul> <ol> <li>
- Forráskód beküldéséhez tedd a kódot ezek közé: <pre lang="php" line="1">Kódrészlet helye itt</pre>