Autor Zpráva
Návštěvník
Profil *
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
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 *
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
Návštěvník:
Stačí ti použit imagefilter.
Návštěvník
Profil *
pcmanik:
Skvělé. Jen otázka. Pořadí argumentů vychází z GDI+ nebo to maj jinak?
pcmanik
Profil
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 *
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);
mění pouze střed a vlastně i kontrury trochu ztmavnou, ale já chci např. jen změnit barvu vnitřku, nikoliv kontur, nebo naopak změnit jen barvu kontur, ale ne vnitřku... To asi nejde, že?
Návštěvník
Profil *
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 *
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;
mít jednu funkci, která vrátí integer pro rgba místo pole s indexy.
Chro
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0