2010-02-12 19 views
8

Próbuję opracować aplikację pędzla przez processingjs. Ten interfejs API ma funkcję loadPixels(), która załaduje wartości RGB do tablicy. Teraz chcę przechowywać tablicę w bazie danych serwera.Klient kompresja danych klienta

Problem stanowi rozmiar tablicy, kiedy przekonwertuję na ciąg o rozmiarze 5 MB.

Czy najlepszym rozwiązaniem jest kompresja na poziomie javascript? Jak to zrobić?

Odpowiedz

8

Zobacz przykład http://rosettacode.org/wiki/LZW_compression#JavaScript dla przykładu kompresji LZW. Działa najlepiej na dłuższych łańcuchach z powtarzającymi się wzorami.

Z Wikipedia article na LZW:

Słownik jest inicjowany zawierać struny jednoznakowe odpowiadającą wszystkich możliwych znaków wejściowych (i nic innego wyjątkiem jasne i jeśli przystanek kodów są używane). Algorytm działa poprzez skanowanie ciągiem wejściowym dla kolejnych dłuższych podciągów , dopóki nie znajdzie takiego, który jest w słowniku, a nie znajduje się w nim . Gdy taki ciąg zostanie znaleziony, wskaźnik dla ciąg mniej ostatniego znaku (tj najdłuższy podciąg, który ma w słowniku ) jest pobierana ze słownika i wysłany do wyjścia, a nowy ciąg (w tym ostatni znak ) jest dodawany do słownika z następnym dostępnym kodem. Ostatni znak wejściowy jest następnie używany jako następny punkt początkowy do skanowania pod kątem podciągów .

W ten sposób, kolejno już łańcuchy są zarejestrowane w słowniku i udostępnione późniejszego kodowania jako jedno wyjście wartości. Algorytm działa najlepiej na danych z powtarzającymi się wzorami, więc początkowe części wiadomości będą miały niewielką kompresję. Ponieważ jednak komunikat rośnie, stopień kompresji ma asymptotycznie maksimum.

+1

W moim przypadku zmniejszono to do 33% rzeczywistego rozmiaru. – Soft

+0

@Soft, to całkiem fajne! Cieszę się, że to pomogło. –

+1

Ta implementacja nie działa w niektórych przypadkach. Kodowałem dużą porcję kodu HTML i nie było prawidłowo dekodowane. Zwrócono wartość null. Zamiast tego użyj tej implementacji: https://gist.github.com/revolunet/843889 – shrimpwagon