Autor Zpráva
janbarasek
Profil
Ahoj,
už nějakou dobu vykresluji přes PHP GD různé grafy a automaticky generované obrázky, nicméně narážím na jeden vizuální problém. Po technické stránce se vše zobrazuje jak má a vše je správně, spíše bych chtěl vylepšit způsob zobrazení.

Mám dejme tomu příklad vygenerovaného grafu:

Graf funkce je vygenerovaný správně, nicméně čára je "ostrá" ve smyslu velkého kontrastního přechodu hran. Buď se vykresluje bílé pozadí, nebo modrá křivka, nikde není žádný odstín.

Rád bych docílil toho, aby se graf zobrazoval "vyhlazený", na př. takto (k vygenerování jsem použil externí aplikaci):


Ideálně bych rád vše řešil na úrovni PHP GD bez instalace dalších knihoven (pokud to bude možné). Graf vykresluji jako velké množství navzájem propojených rovných čar (křivek), které jsou velice krátké a je jich hodně (délka max. 2px). Pokud budu chtít vykreslit "hezkou" čáru, půjde tento způsob použít, nebo existuje nějaká funkce, které bych zadal dlouhý seznam bodů, kudy má čára procházet a ona jí vykreslí už rovnou hezky vyhlazenou a dopočítá prostor mezi pixely, o kterých nemá informaci?
Alphard
Profil
Jak to vypadá s imageantialias()?
Pepiik
Profil
imagecopyresampled() toto používám já na vyhlazení.
Alphard
Profil
Pepiik [#3]:
To se používá pro zmenšování obrázků. Lze s ní dosáhnout lepšího výsledku než jen s imagecopyresized(), ale tady prostor pro její využití moc nevidím. Jedině generovat super velké obrázky a pak je zmenšovat :-)
janbarasek
Profil
Alphard:
Díky, funkce imageantialias() vyhlazuje většinou hezky. Pokud má čára malý úhel (hádám, že méně než 3°), tak se vyhlazení nepovede. Nicméně to nebývá často, takže graf vypadá většinou hezky.

Můžeš se podívat na živou ukázku a případně prozkoušet i jiné dotazy na podobné grafy.

Jedině generovat super velké obrázky a pak je zmenšovat
Jenom to ne. Už takhle je dost těžké ten graf vygenerovat v nějakém rozumném čase (většinou se to stihne do 30ms) a kdybych to měl ještě generovat větší a zmenšovat, tak by to zabralo aspoň polovičku čekání, což by bylo při větším provozu asi znát.
Pepiik
Profil
Doporučuji ti udělat cache na straně serveru. Jestli máš vstupní data, která jsou hodně často stejná tak uložit na disk a při dalším zobrazení jen zobrazit. Tím se nemusí zbytečně generovat..
janbarasek
Profil
Pepiik:
To mě napadlo taky, ale doba přístupu na disk a do databáze je daleko větší, než vygenerování celého obrázku znovu. Vyplatilo by se to jen u komplikovaných grafů, které se ale pokládají zpravidla jen 1x, takže to je zbytečná paměť. Sice si vedu statistiky četnosti vyhledávání, ale to je spíše kvůli optimalizaci výsledků a pro vedení zpětné vazby při hledání bugů (protože lidi bugy hlásí jen vzácně, tak to řeším takto).
1Pupik1989
Profil
Další možnost je rozdělit podklad a křivku. Pak by se dal té křivce přes image_filter aplikovat gaussian blur a následně vykreslit na podklad.

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: