Extrémně rychlý enkodér JPG pro Actionscript 3

Actionsctipt and C++

Pokud někdy budete programovat aplikaci, která vyžaduje uložení obrázku na server nebo lokální disk. Dojdete k nepříjemnému zjištění, že vám toho Actionscript 3 nenabízí mnoho. V základní výbavě disponuje enkodováním obrazových dat (BitmapData) do dvou formátů a to JPG a PNG. Zásadní problém při enkodování pomocí AS3 je stále jeho relativně nízká výkonost.

Srovnání JPG a PNG není na místě. PNG generuje AS3 celkem svižně, bohužel hlavní nevýhoda PNG je jeho datová náročnost. Naopak JPG je svým ztrátovým kodekem velice efektivní na velikost výsledných dat, bohužel časy které AS3 potřebuje na enkoding jsou extrémní.

U obrázku o velikost pár desítek pixelů je to relativně zanedbatelné i když také dlouhé. V případě zpracování fotografií, či náročnější grafiky (více než 1024x768) se časy u JPG vyšplhají klidně i na 50 a více vteřin. Což je opravdový nekomfort.

Komunita vývojářů AS3 nabízí několik alternativ k defaultní třídě JPGEncoder, které algoritmus optimalizují právě s ohledem na délku výpočtu. Optimalizované algoritmy od ByteArray dosahují zhruba třetinových až čtvrtinových časů oproti interním třídám actionscriptu. Bohužel i tak je to na větší obrzové plochy málo.

Prozatím se mi osvědčila poslední možnost a to kombinace Actionscriptu a C++. Algoritmus kódování JPG je napsán právě v C++ a převeden pomocí Alchemy (labs.adobe.com) na knihovnu SWC, která je v AS3 použitelná. Časy takto zpracovaného algoritmu jsou zatím skvělé. U Obrázků o velikosti 1024 x 768 je kódování otázkou milisekund, větší formáty se vejdou do 10 vteřin.

Tam kde časy u AS3 začínají na desítkách vteřin případně v řádu minut, dokáže C++ algoritmus pracovat v řádech milisekund nebo vteřin. Výsledné časy samozřejmě záleží na procesoru ale i na běžné konfiguraci X2 1,6GHZ jsou časy výborné.

Knihovna umožňuje využít synchroní a asynchroní výpočet JPG. Časy se enkodingu se liší v řádu stovek milisekund. 

Tabulka srovnání (X2 1,6GHz, 1024x1024) :

   Čas enkodingu JPG 80% (ms)
 Velikost souboru
MX  11582  580 959
Kyle Lu  11577  723 711
ByteArray
 7238  580 959
Alchemy (async)
 825  341 698
Alchemy (sync)
 513  341 698

Výstup algoritmu Alchemy (sync) - zobrazit obrázek.

Demo aplikace (stáhnout včetně SWC knihovny)

Omlouváme se, ale pravděpodobně nemáte k dispozici flash.

  • Facebook
  • Twitter
  • Dribbble
Michal Hotovec
"Přibližně 10 let se pohybuji v oblasti grafiky, webu a videa. Vizuální tvorba je mojí prací a zároveň koníčkem. Baví mne pracovat s lidmi kteří něco umí. S lidmi, kteří umí používat mozek, protože jinak je to strašlivá nuda."