Autor Zpráva
leonid
Profil
Dobrý podvečer,


Vytvořím červený čtverec 100x100px z transparentního gifu.

<?php
$im = imagecreatefromgif("img/empty/trans.gif");
$color = imagecolorallocate($im, 255, 0, 0);
imagefilledrectangle($im,100,100,200,200,$color);
imagegif($im,'img/empty/trans.gif');
imagedestroy($im);
?>


Nyní by jsem chtěl červený čtverec vymazat, aby místo kde byl čtverec, bylo opět transparentní.

Zkoušel jsem imagecolortransparent a jediného výsledku jsem dosáhl, že původní místo kde byl čtverec sice dokážu aby bylo opět transparentní, jenže zbytek obrázku o průhlednost přijde.

Pořebuji být schopen objekty, které vytvořím pomocí php na transparentním pozadí dokázat později mazat, aniž by obrázek přišel o průhlednost. Jde to vůbec udělat?
sarojan
Profil
Co takhle přidat do URL ?object=rectangle a ten čtverec tam dávat jenom přes podmínku?
leonid
Profil
To by mě nefungovalo. Mám průhlednou plochu 1000x1000px na které se vytváří barevné obrazce. Čas od času potřebuji nějaký z nich odstranit. Zkoušel jsem toto:

$im = imagecreatefromgif("img/empty/trans.gif");

$red = imagecolorallocate($im, 255, 0, 0);

imagecolortransparent($im, $red);

imagefilledrectangle($im, 100, 100, 200, 200, $red);

imagegif($im, 'img/empty/trans.gif');

imagedestroy($im);


Výsledkem je průhledné místo kde byl předtím čtverec, jenže zbytek obrázku už není transparentní, ale černý. Nerozumím tomu.
leonid
Profil
Nikdo neví jak to udělat??
Nox
Profil
leonid:
Co dát colortransparent za filledrectangle? Jen tipuju
leonid
Profil
jdu to zkusit
leonid
Profil
Tak nic, chová se to úplně stejně.
Joker
Profil
leonid:
Kód v [#3] je podle mě správně, akorát nedávejte druhý parametr funkci imagecolortransparent.
Nechcete přenastavit průhlednou barvu (což právě způsobí, že dříve průhledné části už nebudou průhledné), ale získat barvu, která je aktuálně nastavená jako průhledná a pak s ní vyplnit ten prostor- jestli jsem to dobře pochopil.
leonid
Profil
Jestli vám dobře rozumím, mám ten prostor jehož znám barvu a souřadnice (červený čtverec), vyplnit barvou, která je nastavená jako průhledná. To zní logicky, jenže jak ale zjistím která barva je nastavená jako průhledná (pokud nějaká vůbec je - nerozumím jak to funguje), když začínám s úplně prázdným průhledným obrázkem, do kterého umístím jednobarevný objekt?

Ještě jednou postup:
1) úplně prázdný transparentní gif o vel. 1000x1000px
2) vytvořím pomocí funkce #1 červený čtverec 100x100px (souřadnice jsou 100,100,200,200)
3) teď ten prostor kde je čtverec potřebuju zase vymazat (zprůhlednit). Znám jeho barvu a souřadnice.


p.s. ještě dodám, že původní prázdný gif 1000x1000px vytvořím ručně ve photoshopu, ale to je asi jedno předpokládám.
Joker
Profil
leonid:
jenžejak ale zjistím která barva je nastavená jako průhledná
Vždyť to tam píšu: nedávejte druhý parametr funkci imagecolortransparent

pokud nějaká vůbec je
No jestli kolem toho čtverce je průhledný prostor, tak tam zjevně průhledná barva nastavená je.
leonid
Profil
Joker:
No jestli kolem toho čtverce je průhledný prostor, tak tam zjevně průhledná barva nastavená je.

Ok, stále nevím která to je.


Vždyť to tam píšu: nedávejte druhý parametr funkci imagecolortransparent

The identifier of the new (or current, if none is specified) transparent color is returned.
Zkusím rozluštit co mi to vrací
Už začínám tušit jak na to. Přemalovat všechno "průhlednou" barvou a nechat co chci nechat. Trochu komplikované, ale půjde to. Opravdu to nejde jedním příkazem kdy vymažu (zprůhledním) konkrétní objekt dle souřadnic?
Další 3 hod. experimentů pryč. Opravdu se nenajde někdo, kdo mi jednoznačně dokáže odpovědět jak to udělat?
Asi je to neřešitelné čeho chci dosáhnout. V momentě kdy vyplním objekt "průhlednou" barvou se znehodnotí vše co do té doby bylo průhledné na neprůhledné :(

Moderátor Joker: Po sobě jdoucí příspěvky sloučeny do jednoho
Joker
Profil
leonid:
The identifier of the new (or current, if none is specified) transparent color is returned.
Zkusím rozluštit co mi to vrací
„Vrací identifikátor nové (nebo stávající, pokud nová není zadaná) průhledné barvy“

Opravdu to nejde jedním příkazem kdy vymažu (zprůhledním) konkrétní objekt dle souřadnic?
Jaký „objekt“? GIF nemá žádné objekty a nemá možnost je vymazat.
V GIFu je průhledná jednoduše barva jako všechny ostatní a průhledné je to, co je nakreslené „průhlednou barvou“.
Průhledná barva může být jen jedna a pokud změníte která barva je průhledná, věci nakreslené tou „dříve průhlednou“ přestanou být průhledné.

Pořád si myslím, že by mělo stačit nechat si vrátit tu stávající průhlednou barvu a pak s ní vykreslit to co má být průhledné.
Připadně by možná nějak šlo nahradit barvu za jinou barvu.
leonid
Profil
Joker:
Jaký ‚objekt‘? GIF nemá žádné objekty a nemá možnost je vymazat.

Jako vytvořím uvnitř průhledného obrázku 1000x1000px čtverec 100x100px jednoduše že ho "přikreslím" a okolí zůstává stále průhledné (viz. funkce #1) tak ho potřebuji "odkreslit".

Bohužel jediné řešení které mě napadá je pokud budu potřebovat nějaký čtverec vymazat, znovu všechny odznova na prázdném gifu nakreslit s vynecháním toho, kterého se chci zbavit. Což je mizerné řešení..

Jinými slovy potřebujete zbourat jeden dům uvnitř čtvrti, tak zbořím celou čtvrť a znovu postavím všechny původní domy krom toho jednoho co jsem chtěl původně zbořit.
leonid
Profil
leonid:
Pořád si myslím, že by mělo stačit nechat si vrátit tu stávající průhlednou barvu a pak s ní vykreslit to co má být průhledné.

Toto jsem zkoušel na tisíc variací. Vždy mi to zneprůhlední co bylo dříve průhledné. Takže výsledek je sice "vymazání" té oblasti co potřebuji, ale nedokážu zabránit aby zůstalo neprůhledné co předtím průhledné bylo.
Davex
Profil
leonid:
Stále nechápu, proč by neměly fungovat Jokerovy rady. Tahle nějak mi to funguje:
<?php
  $im = imagecreatefromgif("img/empty/trans.gif");
  $red = imagecolorallocate($im, 255, 0, 0);
  imagefilledrectangle($im, 100, 100, 200, 200, $red);

  $trans = imagecolortransparent($im);  /* zjistit průhlednou barvu v obrázku */
  imagefilledrectangle($im, 100, 100, 200, 200, $trans); /* překreslit obdélník průhlednou barvou */

  imagegif($im,'img/empty/trans.gif');
  imagedestroy($im);
?>
leonid
Profil
Joker a Davex díky za pomoc, když srovnám script #3 se scriptem #15 už chápu kde jsem dělal chybu.

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