2010-02-12 6 views
8

J'essaie de développer une application de pinceau à travers le traitementjs. Cette API a la fonction loadPixels() qui chargera les valeurs RVB dans le tableau. Maintenant, je veux stocker la matrice dans le serveur db.Javascript compression de données client

Le problème est la taille de la matrice, quand je convertis en une chaîne dont la taille est de 5 MB.

La meilleure solution est de faire de la compression au niveau javascript? Comment faire?

Répondre

8

Voir http://rosettacode.org/wiki/LZW_compression#JavaScript pour un exemple de compression LZW. Cela fonctionne mieux sur des chaînes plus longues avec des motifs répétés.

De l'Wikipedia article sur LZW:

Un dictionnaire est initialisé pour contenir les chaînes d'un seul caractère correspondant à tous les caractères d'entrée possibles (et rien d'autre sauf les codes clairs et arrêter si ils sont utilisés). L'algorithme fonctionne en parcourant l'entrée chaîne pour des sous-chaînes de temps successivement plus longues jusqu'à trouver qui ne figure pas dans le dictionnaire. Lorsqu'une telle chaîne se trouve, l'indice de la chaîne moins le dernier caractère (c.-à- la plus longue sous-chaîne qui est dans le dictionnaire) est récupéré à partir du dictionnaire et envoyé à la sortie, et la nouvelle chaîne (y compris ) est ajouté au dictionnaire avec le code suivant disponible. Le dernier caractère d'entrée est ensuite utilisé en tant que point de départ suivant pour rechercher les sous-chaînes .

De cette façon, successivement des chaînes plus longues sont enregistrés dans le dictionnaire et mis à disposition pour encodage ultérieur en tant que valeurs de sortie unique . L'algorithme fonctionne mieux sur données avec des motifs répétés, de sorte que les parties initiales d'un message verront peu de compression. Lorsque le message se développe, cependant, le taux de compression tend asymptotiquement au maximum .

+1

Dans mon cas cela réduit à 33% de la taille réelle – Soft

+0

@ Soft, c'est plutôt cool! Content que cela ait aidé. –

+1

Cette implémentation ne fonctionne pas dans certains cas. Je codais un gros morceau de HTML et il ne décodait pas correctement. Retenu renvoyant null. Utilisez cette implémentation à la place: https://gist.github.com/revolunet/843889 – shrimpwagon