IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Compression de courte chaîne


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut Compression de courte chaîne
    Hello,

    Je désire compresser une courte chaîne d'information (pour générer un code-barres de petite taille). En m'aidant de java.util.zip, je m'aperçois que la chaine compressée est plus grande que la taille originale (ce qui est normale avec les données que je donne et l'algorithme utilisé).

    Voici un exemple de chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <S>fi=3452355&re=aadjek&ty=df&nb=1000343</S>
    Y-t-il un autre algorithme/API à utiliser pour réduire la taille de cette chaîne ?

    Je me suis aider de ce code pour effectuer la compression : http://softwaredevscott.spaces.live....F3B7!299.entry

    Merci bien.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ce n'est pas possible car
    -> pour un code barre, tu est limité dans le nombre d'octets utilisable (obligé de prendre de l'ascii en général
    -> Une courte chaine ne présente aucune redondance pouvant servir à la compression

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    Merci bien

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bah, au fond... Si le <S> de début et le </S> de fin sont toujours là, il est inutile de les mettre dans la forme compressée. Tu n'as qu'à les remettre à la décompression.

    Si les paramètres sont toujours fi, re, ty et nb, dans cet ordre, tu peux virer cette information.

    Ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    3452355&aadjek&df&1000343
    Les nombres peuvent être écrits en hexadécimal ou en base64 pour gagner de la place.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tes différents champs ont une limite de taille bien précise, on pourrait même aller plus loin dans la proposition de thelvin en supprimant les & et en mettant chaque champs sur un nombre fixe de caractère.

    a++

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    767
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 767
    Par défaut
    Oui c'est possible il faut utiliser une compression statistique de Huffman avec une table fixe calculée une fois pour toute. Ce qui te permet de la stocker sans la faire transiter.
    Les caractères revenant le plus souvent sont compressés sur quelques bits (3 ou 4), les autres sur plus.

    Zip sauve un dictionnaire pour décompresser ce qui le rend inutile pour des fichiers petits.

  7. #7
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    jimmy: tu va te retrouver avec du pur binaire, autrement dit une information qu'on ne peux sotkcer dans un code barre. A l'arrivée il devra convertir ses nombres 8 bits en un ensemble de données acceptable par le truchement, par exemple, de base64, ce qui au final refera grandir l'élément de 1/3 de la taille compressée. Vu le style de donnée, je suis dubitatif quand à
    -> la présence de données récurrentes
    -> l'utilité de tout ce bordel pour peut être gagner 5%

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    Merci pour vos conseils.

    Les valeurs du style "re" correspondent à un argument. Il pourrait être différent, c'est pourquoi on doit le garder. Les tailles ne sont pas fixes. Si possible, j'aimerais ne pas devoir changer la structure de ce string (mise à part une compression ou autre).

    Je vous expose le processus complet... Peut-être trouvera-t-on une autre idée pour améliorer ceci...

    Le but : Avoir un code-barre le plus petit possible car il devra être imprimé sur des documents destinés à des clients.

    1) Exemple : Valeur du code barre (pire des cas) (dans la réalité, les chiffres ou les lettres ne se suivront pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <S>fi=1234567891234&re=abcdefghijklmnopqrstuvwxyzabcdef&ty=ddf&nb=fi=1234567891234</S>
    2) Génération d'un code-barres (avec zxing, type QRCode )
    3) Insertion du code-barres sur un document
    4) Impression (en papier)... le document part chez le client et revient
    5) Scannage du document (matériel standard (200 DPI))
    6) Découpage du PDF pour isolé le code-barre (avec API itext) cela permettra de demander moins de ressource à la prochaine étape
    7) Conversion du morceau de PDF en image (avec convert de ImageMagick) (cela permettra d'être plus efficace (améliorer la lisibilité) pour la prochaine étape)
    8) Lecture du code-barre (avec Zbar)

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    solution alternative: tu prend un code QR, qui non seulement permet de stocker beaucoup plus d'information mais présente aussi les avantages suivants
    -> support unicode
    -> Standard existe pour y stocker des url
    -> identifiable automatiquement sur un document par zxing, sans nécessité de découpage (j'ai fait des tests ici, par curiosité, pour d'autres besoins)
    -> supporte la dégradation (papier griffé, déchirure, etc) théoriquement jusqu'à 30%

    exemple: lien vers cette page:


    la version "code barre" d'un lien beaucoup plus court:

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    J'utilise un QRCode (j'ai ajouté cette info qui manquait à mon post).

    Le découpage n'est pas nécessaire mais il permet de diminuer le temps CPU lors de la conversion en GIF (qui permet d'améliorer la reconnaissance du code-barre) (en tout cas avec Zbar).

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ben avec un QRCode tu n'a pas besoin de compresser le texte !!!
    Pour ton dernier exemple ca donne ceci :

    (via le générateur online de zxing)


    a++

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Je décode l'image attachée en moins d'une seconde avec le décodeur en ligne de zxing. Par rapport au temps nécessaire à l'opérateur pour aller sélectionner le code, je suis pas sur qu'il y aie quelque chose à gagner....
    J'ai l'impression que tu te gratte la tête pour essayer de gagner du temps là où il n'y a pas grand chose à gagner....
    Images attachées Images attachées  

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    Merci de votre intérêt.

    La compression n'est pas pour que cela fonctionne mais pour obtenir un code-barre le moins détaillé possible pour qu'il soit facilement lu.

    Plus il y a d'informations dans le code-barres, plus il devient "précis" (les dessins sont plus petits).

    Je recherche à obtenir un code-barre le moins détaillé possible pour pouvoir réduire sa taille au maximum sur le document à imprimer.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    J'ai l'impression que tu te gratte la tête pour essayer de gagner du temps là où il n'y a pas grand chose à gagner....
    Le décodage se passe très bien si on prend un image depuis l'ordinateur, je suis d'accord.

    Cependant, si le code-barre est imprimé (disons avec une taillle 1 cm sur 1cm) et puis scanné en une résolution standard (200 DPI) il devient plus difficile au décodeur de faire son travail.

  15. #15
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour une même taille de points, la différence entre les données "complètes" et les données hypothétiquement compressée d'un facteur 30% qu'on a utilisé plus haut, ca va être de l'ordre de 2 à 4mm sur le dessin final pour une même taille de points (en prenant un code utilisant un point de 0.5mm à 1 mm). Ca vaut vraiment le coup de se casser la tête pour réduire une image de 29mm à 25mm (si un point = 1mm)?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    Mon but est d'obtenir un code-barres de 1 cm sur 1 cm (ou moins).

    J'essaie d'explorer le plus de voies possible pour y arriver.... d'après vos conseils, une simple compression ne va pas pouvoir m'aider pour ceci...

    Merci

  17. #17
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Maintenant un bon "truc" si tu utilise un scanner PDF, c'est de ne pas passer par des outils comme imagemagick ou pdf2ppm, car ceux-ci vont faire le "rendu" de chaque page suivant les règle PDF. Tu aura, souvent, un meilleur résultat en utilisant un outils comme pdfimages qui va ouvrir le pdf et extraire les images qui sont dedans sans y toucher. Avantage: elle sont telle que le scanner les a vue, et non pas telle qu'un outils PDF les afficherais. ci joint le même code QR issu du même PDF issu d'un scan unique à 200DPI N&B, l'un convertit en image par pdfimages, l'autre par pdf2ppm

    L'un est décodabe, l'autre non...

    La seule compression valable que je verrais serait d'attribuer une numéro unique à ta chaine, de la stocker dans une DB et de n'encoder que ce numéro dans le code. Mais ca nécessite que le client aie accès à la db en question...
    Images attachées Images attachées   

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 29
    Par défaut
    Je vais regarder ceci. Merci bien :-)

Discussions similaires

  1. Compression de chaîne
    Par Tommy31 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 29/07/2011, 17h35
  2. Compresser/Décompresser une chaîne
    Par Florian V dans le forum LabVIEW
    Réponses: 0
    Dernier message: 27/05/2010, 12h13
  3. [RegEx] S'arreter à la chaîne la plus courte qui correspond au pattern
    Par Concombre Masqué dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2008, 18h55
  4. Compression d'une chaîne de caractère
    Par olivier1209 dans le forum C
    Réponses: 11
    Dernier message: 12/11/2006, 09h30
  5. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo