Autor | Zpráva | ||
---|---|---|---|
Návštěvník Profil * |
#1 · Zasláno: 21. 2. 2014, 13:38:17 · Upravil/a: Návštěvník
mám celkem tři otázky, jak udělat následující a jestli to jde:
ztmavit obrázek, který bude v png s alfa kanálem (bílé pozadí tam nebude, tak aby se ztmavila buď a) pouze kontura rtů do černa b) aby se ztmavila pouze světlá barva aby byly rty trochu tmavší, ale ještě červené a c) jestli by ještě šlo nastavit té světlé či ztmavené barvě odstín či tón. Samozřejmě bych to chtěl udělat pomocí php s tím, že si potom hotový obrázek vložím do jiného předem připraveného obrázku. ps: konturami myslím tu tmavě červenou tlustou čáru |
||
janbarasek Profil |
#2 · Zasláno: 21. 2. 2014, 14:19:16
Návštěvník:
Pokud bychom vycházeli z toho, že všechny pixely mají barvu typu RGB, tak ti k tomu stačí jednoduchá matematika. Čím menší číslo, tím tmavší barva. Vytvoř si nějaký script, který ten obrázek projde pixel po pixelu, zjistí si jeho barvu (jako 3 čísla v RGB) a ke každé z těch zjištěných barev přičti nějakou konstantu a následně ten obrázek znovu vykresli pixel po pixelu. Pokud chceš ztmavovat jen nějaké části, tak stačí při procházení vytvořit podmínku, aby se ignorovala bílá barva, nebo aby se ztmavila třeba jen červená. Červenou barvu (a její odstíny) poznáš tak, že bude první číslo největší ze všech ostatních, třeba toto je červená: 255, 0, 0. Nezapomeň ještě ohlídat, aby při přičítání a odčítání barev nevyšlo číslo větší než 255 a menší než 0. Toto ale jistě víš. |
||
Návštěvník Profil * |
#3 · Zasláno: 21. 2. 2014, 14:29:59
janbarasek:
A proč to dělat tak složitě ručně, když gd by tyto funkce mělo umět? Já mám totiž ještě jiné programování které potřebuju dělat a chtěl bych si ulehčit práci a ne si ji přidělávat. |
||
pcmanik Profil |
#4 · Zasláno: 21. 2. 2014, 15:00:08
Návštěvník:
Stačí ti použit imagefilter. |
||
Návštěvník Profil * |
#5 · Zasláno: 21. 2. 2014, 15:12:48
pcmanik:
Skvělé. Jen otázka. Pořadí argumentů vychází z GDI+ nebo to maj jinak? |
||
pcmanik Profil |
#6 · Zasláno: 21. 2. 2014, 15:39:05
Návštěvník:
Neviem na čo sa konrétne pýtaš? Veď poradie argumentov je predsa z dokumentácie jasné nie? |
||
Návštěvník Profil * |
#7 · Zasláno: 21. 2. 2014, 15:48:00 · Upravil/a: Návštěvník
pcmanik:
Ok, ok. A musím to pokaždé ukládat do souboru? To nejde pracovat tak abych to nechal v paměti dokud neaplukuju všechny effekty?? Už jsem na to přišel jak to udělat aby ztmavly jen ty kontury, např toto: imagefilter($im, IMG_FILTER_COLORIZE, -5, -50, -25); |
||
Návštěvník Profil * |
#8 · Zasláno: 21. 2. 2014, 17:38:55
janbarasek:
Nakonec jsem se přeci jen řídil tvou radou, ono to asi jinak udělat nejde. Je to podle scriptu z internetu, ale jak bych to měl udělat, pokud bych chtěl ty data uložit do souboru? Toto funguje tak, že zadáš png soubor, barvu, kterou hledáš v rgb, tolerance pro rgb spodní limit a toleranci pro rgb horní limit a nakonec barvu za kterou to chceš nahradit. Ale ještě to zkusím předělat tak, aby se to změnilo dynamicky ne konstantně na jednu barvu. function myTest($f, $c, $lower_tolerance, $upper_tolerance, $replace ){ $im = imagecreatefrompng($f); imagealphablending($im, false); $lr = $c[0]-$lower_tolerance[0]; $ur = $c[0]+$upper_tolerance[0]; $lg = $c[1]-$lower_tolerance[1]; $ug = $c[1]+$upper_tolerance[1]; $lb = $c[2]-$lower_tolerance[2]; $ub = $c[2]+$upper_tolerance[2]; for ($x = imagesx($im); $x--;) { for ($y = imagesy($im); $y--;) { $rgb = imagecolorat($im, $x, $y); $c = imagecolorsforindex($im, $rgb); //print_r($c); //die(); if ($c['red'] > $lr && $c['red'] < $ur && $c['green'] > $lg && $c['green'] < $ug && $c['blue'] > $lb && $c['blue'] < $ub ) { // dark colors // here we use the new color, but the original alpha channel $colorB = imagecolorallocatealpha($im, $replace[0], $replace[1], $replace[2], $c['alpha']); imagesetpixel($im, $x, $y, $colorB); } } } imageAlphaBlending($im, true); imageSaveAlpha($im, true); header('Content-Type: image/png'); imagepng($im); imagepng($im, $file_copy); imagedestroy($im); } myTest("test.png",array(233,167,155), array(40,40,40), array(40,40,40), array(242,112,72)); |
||
Návštěvník Profil * |
#9 · Zasláno: 21. 2. 2014, 18:44:19
Můžete mi něco vysvětlit? Proč je tam
$rgb = imagecolorat($im, $x, $y); $c = imagecolorsforindex($im, $rgb); Dva příkazy k získání rgba? Vůbec nechápu tu funkci imagecolorsforindex(). To přeci nedává vůbec žádný smysl. Protože ta funkce nemá vstupní argumenty x,y a $rgb přeci pozici pixelu neobsahuje :-/ Nedá se to udělat jednodušeji pomoci jednoho příkazu něco jako: $rgba = imagecolorsat($im, $x, $y); $a = $rgb & 255; $b = ($rgb >> 8) & 255; $g = ($rgb >> 16) & 255; $r = ($rgb >> 24) & 255; |
||
Chro Profil |
#10 · Zasláno: 22. 2. 2014, 15:08:11
Funkce imagecolorsfor index pouze převádí integer (dlouhé číslo) z funkce imagecolorat do pole na jednotlivé složky barvy red, green, blue a alpha, pričemž každá složka může nabýt hodnotu 0 až 255. S jednotlivými hodnotami se můžou jednodušeji provádět operace, než s jedním integerem.
|
||
Časová prodleva: 10 let
|
0