Image Executable

Obrazy Wykonywalne

When saving images we always have to make a choice of an image format. There are hundreds of them. Each with its own tradeoffs and features. Some of the most performant and interesting ones usually come from scientific papers - they show an amazing compression or novel features but die shortly after because the web and pretty much every operating system supports only the baseline: JPG, BMP, GIF, PNG, SVG. These five formats are our only options - as long as someone has to view the image later.

Zapisując obrazy zawsze musimy wybrać dla nich odpowiedni format. Są ich setki. Każdy cechuje się własnymi kompromisami i właściwościami. Najwydajniejsze i najciekawsze zwykle pojawiają się na łamach artykułów naukowych - pokazują niesamowite współczynniki kompresji lub nowe, ciekawe właściwości, ale giną niedługo później. Dlaczego? Ponieważ sieć www i praktycznie każdy system operacyjny wspiera tylko te podstawowe: JPG, BMP, GIF, PNG, SVG. Te pięć formatów to nasze jedyne opcje - o ile ktoś ma później obejrzeć dany obraz.

But why don't we save an image together with it's decoder? It would certainly enlarge some pictures, especially those with large decoders but overall it would equalize formats and give the innovative formats easier way to go mainstream.

Czemu więc nie zapiszemy obrazu razem z jego dekoderem? Z pewnością powiększyłoby to część obrazów, zwłaszcza tych ze skomplikowanymi dekoderami, ale w sumie wyrównałoby szanse formatów i utorowałoby drogę innowacyjnym podejściom.

So the way to go would be: use portable bytecode (JVM / LLVM / other IR) that can be compiled on the destination machine to produce decoder program. Then run the program in a sandbox to produce the image.

Sposób działania wyglądałby tak: wykorzystać przenośny bajtkod (JVM / LLVM / inny IR), który może być skompilowany na docelowej maszynie, do uzyskania dekodera. Następnie uruchomić dekoder w piaskownicy aby uzyskać gotowy obraz.

What would such method give us? Here are the tradeoffs:

Co dałoby nam takie podejście? Oto kompromisy:

Advantages and tradeoffs

Korzyści i kompromisy

Animation - executable could be run with a time as an input to produce consecutive frames of an animation.

Animacja - dekoder mógłby zostać uruchomiony z czasem jako argumentem - pozwoliłoby to rysować kolejne klatki animacji.

Scalability - using bitmap size as another input would make the image natively scalable.

Skalowalność - użycie wymiarów bitmapy jako kolejnego wejścia pozwoliłoby dekoderowi natywnie przeskalować obraz (ograniczyłoby więc artefakty związane z rozciąganiem).

Compression ratio - given good enough codecs, near-optimal (approaching Kolmogorov complexity of an image in the bytecode used).

Współczynnik kompresji - zakładając dość zaawansowane kodeki, niemal optymalny (bliski złożoności Kołmogorowa obrazu w użytym bajtkodzie).

Compression ratio - every image would have to embed its own decoder - thus enlarging the image. Moving common functions into runtime would reduce the overhead.

Współczynnik kompresji - każdy obraz musiałby zawierać dekoder - tym samym zwiększając swój rozmiar. Przenoszenie częstych funkcji do środowisiska uruchomieniowego (runtime) zmniejszyłoby ten nadkład.

Performance - image executable could use a set of natively optimized libraries available during runtime (fft, H.264, svg primitives, OpenGL, etc.). When used to draw animation, executable could retain its state to allow inter-frame compression.

Wydajność - obrazy wykonywalne mogłyby korzystać z lokalnych, zoptymalizowanych wersji częstych operacji (fft, H.264, prymitywy svg, OpenGL, itd.). Podczas rysowania animacji, mogłyby zachowywać swój stan - pozwoliłoby to na kompresję międzyklatkową.

Performance - before decoding the image, bytecode has to be compiled. It would result in slower decoding speed compared to current codecs.

Wydajność - przed zdekodowaniem obrazu, bajtkod musi zosać skompilowany. W porównaniu ze współczesnymi formatami spowolni to cały proces dekodowania.

Safety - complex (and vulnerable) part of decoding is sandboxed.

Bezpieczeństwo - złożone (i wrażliwe) elementy dekodera będą działać w piaskownicy - oznaczać to będzie większą odporność na wstrzykiwanie kodu.

Promoting innovative codecs - differences between encoding techniques would promote competition and innovation. Any forseeable encoder could save its output as an image executable.

Faworyzowanie innowacyjnych kodeków - różnice w technikach kodowania będą promować rywalizację oraz innowacje. Teoretycznie dowolny kodek móże zapisać obraz w formacie wykonywalnym.

Bytecode lock-in - bytecode choosen as the standard would be very hard to change.

Związanie z bajtkodem - bajtkod wybrany jako część standardu byłby bardzo ciężki do zmiany.