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

Composants VCL Delphi Discussion :

Lecture de code bar depuis image


Sujet :

Composants VCL Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 185
    Points : 65
    Points
    65
    Par défaut Lecture de code bar depuis image
    Bonjour a tous,
    quelqu'un connait-il un composant qui fais le contraire de créer un code bar? Enfaite je scanne une feuille avec un code bar dessu et j'aimerai lire le code bar avec mon application... Depuis une image bmp lire le code bar enfaite...
    Merci d'avance pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 706
    Points : 25 585
    Points
    25 585
    Par défaut
    Hum, il y a souvent des lecteurs de code barre (pour papier) qui se connecte comme un clavier (PSION, LOGITECH, METROLOGIC), et envoie les codes ascii lu comme si l'on avait appuyé sur le clavier, (souvent on utilise un bête TEdit, mais lorsqu'il y a des problèmes de perte de focus, on le résoud par un Hook Clavier, dans ce cas, on configure son lecteur pour qu'il préfixe ses envoie), ... ou sinon des systèmes plus important (SIEMENS, BAUMER), qui emettent des trames TCP/IP quand le nombre de scanner devient vraiement important (souvent à fréquence courte et un recepteur connecté sur le réseau), ces trames contenant l'heure de la saisie, la numéro de la borne, le numéro du scanner et le code barre ...

    mais par contre, un composant qui analyse une BMP, hum c'est plus rare, car c'est comme je l'ai dit fait en hardware par le scanner ... c'est le même principe que l'OCR, deplus cela doit bien géré les effets de dégradation du scanner (code bar pas droit), il vaut mieux éviter les compressions qui vont atténuer les contrastes et donc détériorer la lisibilité ...

  3. #3
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 509
    Points : 2 782
    Points
    2 782
    Billets dans le blog
    10
    Par défaut
    Effectivement Les lecteurs codesbar sont monnaie courante et s'interfacent le plus souvent avec le clavier (montés en série)
    J'ai vu aussi chez un sous traitant d'une grande banque une Appli capable de localiser un code bar sur une image JPEG et de la traiter. Mais là il s'agit d'application plus lourdes

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 138
    Points : 157
    Points
    157
    Par défaut [inv Code Barre]
    Si tu en ai a scanner un document, ne peux tu pas scanner le code barre
    qui va dessus .

    Car il exite des applications qui peuvent extraire le CDB d'un JPEG mais
    elles sont généralement associées à du matèriel lourd (Camera Ocr..ETC) et
    donc chères .

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut
    Voila un lien qui devrait t'interesser.
    http://www.gomaro.ch/Specifications/EAN13.htm

    Si tu vas tout en bas de la page, on peut voir comment le code barre est interpreter.

    Fort de ceci il suffit que ton jpeg est la "bonne resolution", tu n'a plus qu'a lire point par point ton image un point noir = 1 un point blanc = 0 (apres au lieu de noir et blanc tu peux jouer avec les couleur rgb pour etre sur de ne pas passer a coyé) rgb(54,54,54) -> couleur claire, rgb(200,200,200) -> couleur foncée.

    tu obtient donc une chaine binaire, il te suffit ensuite de scindé les different element comme indiquer dans le lien pour retrouver la valeur contenue.

    Je vais rechercxher j'avait fait un truc sur le lecture point par point.

    Edit: pour la resolution, il faut qu'un pixel corresponde a un bit binaire.
    si tes images n'ont pas cette resolution, tu peut toujour essayer de "tarer" la valeur d'un bit en utilisant les 2 premier traits noirs. Si les valeur obtenu sont trop batardes pour etre utilisé, en zoomant l'image une ou 2 fois tu diminuera l'erreur de calcul.
    Pour limiter la taille de ton image garde uniquement une bande d'un pixel de haut.
    /edit

    a++
    Qwaz

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 706
    Points : 25 585
    Points
    25 585
    Par défaut
    Citation Envoyé par Qwazerty
    Edit: pour la resolution, il faut qu'un pixel corresponde a un bit binaire. /edit
    Hum, pas franchement évident non ?

    D'ailleurs, les scanners font un calcul de proportion avec le marqueur de début de code et de fin de code ... en tout cas, oui, avec le JPG faut gérer le Bruit de compression, mais aussi la distorsion et la rotation ...

  7. #7
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    re
    lol tu m'as grillé pour les trait de début j'étais en train de le mettre en edit . mais je pense que c'est tout a fait realisable.
    Pour les distorsions faut savoir ce que notre ami utilise comme Jpeg... scanner a la main ou scanner a plat...
    Pour le scan a la main .. ok ca risque d'etre moins simple! :p

    BATiViR donne voir un exemple de tes scans stp pour voir ce qui est faisable
    a++

  8. #8
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 906
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 906
    Points : 8 539
    Points
    8 539
    Par défaut
    SAlut

    Voila ce que je te propose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    procedure TForm1.Button1Click(Sender: TObject);
      Var ImgBmp      :TBitmap;
          CouleurMax  : TColor;
          Ix : Integer;
          StrBin, StrBinary : String;
          NbrPixel : Integer;
          LargCalc, CalcErr, MesureErr : Byte;
          StrBinMes, Str0 : String;
     
          NbrDeLigne : Integer;
     
          //Pour memoir le Code barre est composé de 95 lignes
    begin
         ImgBmp := TBitmap.Create;
         CouleurMax := 8224125; //RGB 32,32,32  C := R * 65536 + G * 256 + B; ou C := R shl 16 + G shl 8 + B; C(Word) RGB (Byte)
         StrBin := '';
         NbrDeLigne := 95; //95 pour un EAN-13
                           //66 pour un Ean-8
     
         ImgBmp.PixelFormat := Pf24Bit;
         ImgBmp.Width  := ImgCodeB.Width;
         ImgBmp.Height := 1; //On garde juste 1 pixel de haut
         ImgBmp.Canvas.Draw(0,-(ImgCodeB.Height Div 2),ImgCodeB.Picture.Graphic);
         Image1.Picture.Bitmap := ImgBmp; //juste pour voir le resultat
     
         //On recherche les bornes de debut et de fin
         For Ix := 1 To ImgBmp.Width Do
         begin
              If (GetPixel(Image1.Canvas.Handle ,Ix,0) < CouleurMax) Then //Point "noir"
                   StrBin := StrBin + '1'
              Else
              begin
                   If StrBin <> '' Then StrBin := StrBin + '0';
              end;
         end;
     
         //On libert l'image devenue inutile
         ImgBmp.Free;
     
         //On supprime tout ce qui n'est pas 1 en fin de serie (image non noir)
         While Rightstr(StrBin,1) <> '1' Do StrBin := LeftStr(StrBin,Length(StrBin)-1);
     
         //On calcule la largeur d'un trait
         //le Code barre est composé de 95 lignes a ce que j'ai pu en voir, du moins pour la norme EAN-13
         NbrPixel := length(StrBin);
         LargCalc := NbrPixel Div NbrDeLigne;
     
         //On peut egalement calculer l'erreur qui existe
         CalcErr := NbrPixel Mod NbrDeLigne; //CalcErr contient le nombre de pixel en trop
     
         //On lit le nombre de pixel de couleur identique a la suite
         StrBinary := '';
         repeat
               Str0 := LeftStr(StrBin,1); //Couleur du 1er de la serie
               If Str0 = '0' Then
                  Ix := Pos('1',StrBin)
               Else
                  Ix := Pos('0',StrBin);
     
               //On sumul d'avoir trouver une lettre supplementaire a la fin de la chaine
               If Ix = 0 Then Ix := Length(StrBin)+1;
     
               Str0 := LeftStr(StrBin,Ix - 1);
               //Str0 contient une serie de 0 ou de 1.
               //On div pour optenir le nombre de Bits "rééls" sans tenir
               // comptedes erreurs du a la resolution du scan
               StrBinary := StrBinary + DupeString(leftStr(Str0,1),Length(Str0) div LargCalc);
               //On peut egalement conptabilisé l'erreur "corrigée"
               Inc(MesureErr,Length(Str0) Mod LargCalc);
               //On reduit StrBin en supprimant la partie qui vient d'etre traitée
               StrBin := RightStr(StrBin,Length(StrBin)-Length(Str0));
     
        Until StrBin = '';
     
        If CalcErr = MesureErr Then
        begin
             //On a bien eu le nombre de pixel en trop prevu
        end
        Else
        begin
             //Il y a un delta entre la correction effective et celle prevu!
        end;
     
        Edit2.Text := StrBinary; //Juste pour voir
     
     
     
        //Maintenant il faut traiter la chaine StrBinary
        //Elle contient le code binaire du CodeBarre
        //Voir ce lien .. ou d'autres au choix pour le decryptage
        //http://www.gomaro.ch/Specifications/EAN13.htm
     
        //Le meme principe peut etre fait pour les autre type de code barre
        //la partie lecture graphique etant la meme seule le nbrDeLigne changera
        //et bien sur le traitement qui reste a faire qui lui aussi dependra du type
        //de code barre lut
     
     
    end;
    J'ai concue et testé ce code avec le code barre du site
    http://www.gomaro.ch/Specifications/EAN13.htm

    Il reste a faire le decrypatge du StrBinary, tout est dans le site je n'ai pas regarder mais ca ne doit pas etre bien sorcier c'est juste un peu de reverse a faire

    Voila j'espere que ca marchera avec les autres code barre
    Pour faire des testes il faudrait des code barre avec leur correspondance Binaire.

    A++
    Qwaz

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Image]Convertir du code HTML en image
    Par lalouve dans le forum Bibliothèques et frameworks
    Réponses: 14
    Dernier message: 09/05/2012, 15h47
  2. Lire code-barre depuis image scannée ?
    Par sbadecoder dans le forum Composants VCL
    Réponses: 4
    Dernier message: 20/11/2010, 00h44
  3. Lecture de codes barres et port PS2
    Par chkdsk2k dans le forum Entrée/Sortie
    Réponses: 14
    Dernier message: 03/08/2006, 23h19
  4. Lecture de code barre
    Par Yanmeunier dans le forum C
    Réponses: 7
    Dernier message: 22/09/2005, 16h05
  5. [JS] Appeler du code C# depuis du code JS
    Par DontNet dans le forum ASP.NET
    Réponses: 3
    Dernier message: 05/05/2005, 20h00

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