Sei sulla pagina 1di 3

Utilizzo della libreria ZXing per la decodifica dei codici a barre

Il primo passo da compiere per poter utilizzare la libreria ZXing1 è scaricarla dal sito ufficiale:
http://zxing.googlecode.com/files/ZXing-1.6.zip.

All’interno dell’archivio zip sono presenti le seguenti directory:

• actionscript: relativo alla componente per flash.


• android,android-integration,android-test: relativo alla componente per android.
• iphone: relativo alla componente per iphone.
• rim: relativo alla componente per rim.

• javame, cpp: relativo alla componente per symbian.


• core, javase: questa è la componente principale della libreria.

Prerequisiti
É necessario aver installato sul proprio sistema Java, Ant.

Iniziamo
Bisogna posizionarsi all’interno del root folder della librerie e compilare il progetto con ant
ant -f core / build . xml
ant -f javase / build . xml
per poter usare la classe basta rimanere nella stessa posizione ed eseguire:
java - cp javase / javase . jar : core / core . jar
com . google . zxing . client . j2se . C ommand LineR unner [ URL ]
dove per url si intende la posizione dell’immagine all’interno della quale si vuol trovare (ad esempio /home/antonio/Imma-
gini/barcode1.jpg). Questa classe ha un metodo pubblico statico che permette, data una immagine, di individuare un codice
a barre e di decodificarlo. Abbiamo però la necessità di individuare più di un codice a barre all’interno di una immagine e
successivamente di decodificarli uno ad uno. Dopo una lettura approfondita del wiki del progetto ho individuato una classe
che permette la rilevazione multipla dei codici a barre ovvero: GenericMultipleBarcodeReader.java. Ho recuperato il sorgente
della classe com.google.zxing.client.j2se.CommandLineRunner ed individuato la porzione di codice che individua il codice a
barre all’interno di una immagine e lo decodifica:
private static Result decode ( URI uri ,
Hashtable < DecodeHintType , Object > hints ,
boolean dumpBlackPoint ,
int [] crop ) throws IOException {
. .. . . .. . . . .. . . .. . . .
Result result = new Mu ltiFor matRea der (). decode ( bitmap , hints );
ParsedResult parsedResult = ResultParser . parseResult ( result );
System . out . println ( uri . toString () + " ( format : " + result . getBarcodeFormat () +
" , type : " + parsedResult . getType () + " ):\ nRaw result :\ n " + result . getText () +
" \ nParsed result :\ n " + parsedResult . getDisplayResult ());

System . out . println ( " Also , there were " + result . getResultPoints (). length
+ " result points . " );
for ( int i = 0; i < result . getResultPoints (). length ; i ++) {
ResultPoint rp = result . getResultPoints ()[ i ];
System . out . println ( " Point " + i + " : ( " + rp . getX () + " ," + rp . getY () + " ) " );
}

return result ;
. .. . . . .. . . .. . . .. . . .
}

1 si pronuncia Zeta crossing


e l’ho sostituito con questo:
private static Result decode ( URI uri ,
Hashtable < DecodeHintType , Object > hints ,
boolean dumpBlackPoint ,
int [] crop ) throws IOException {
. . .. . . .. . . .. . . .. . . .
Reader reader = new Mu ltiFor matRea der ();

M u l t i p l e B a r c o d e R e a d e r m = new G e n e r i c M u l t i p l e B a r c o d e R e a d e r ( reader );
Result [] r = m . decodeMultiple ( bitmap , hints );
for ( Result result : r ) {
ParsedResult parsedResult = ResultParser . parseResult ( result );
System . out . println ( uri . toString () + " ( format : "
+ result . getBarcodeFormat () + " , type : "
+ parsedResult . getType () + " ):\ nRaw result :\ n "
+ result . getText () + " \ nParsed result :\ n "
+ parsedResult . getDisplayResult ());
System . out . println ( " Also , there were "
+ result . getResultPoints (). length + " result points . " );
for ( int i = 0; i < result . getResultPoints (). length ; i ++) {
ResultPoint rp = result . getResultPoints ()[ i ];
System . out . println ( " Point " + i + " : ( " + rp . getX () + " ,"
+ rp . getY () + " ) " );
}
}
return null ;
. .. . . .. . . .. . . . .. . . .
}

Test
Dopo aver scaricato un insieme di immagini di test di codici a barre da un altro progetto trovato su sourceforge2 , ho effettuato
un insieme di test:
Descrizione Test Vecchia classe Codice Nuova Classe Note
Scansione immagine barcodeCollage.jpg 011110853585 011110853585 Ok
031000113476
325866041210
325866041210
011110843500
Scansione immagine barcodeCollage2.jpg 031000113476 031000113476 Ok
073410023006
325866041210
011110843500
011110853585
11108535
Scansione ricetta 00000005.jpg VRNGPP45H29E888T VRNGPP45H29E888T No
0201161496 manca 18008

La decodifica di più codici a barre all’interno di un documento è basata su una ricerca degli stessi di tipo euristico. Il test
a volte va a buon fine trovando tutti e decodificando tutti e tre i codici a barre, a volte ne trova solo 2. Una alternativa a
questa ricerca è quella di utilizzare l’opzione crop della classe CommandLineRunner per indicare dove deve essere fatta la
ricerca di seguito mostro i risultati ottenuti:
2 precisamente su http://sourceforge.net/projects/jbarcode-scan/
Descrizione e risultato test

java - cp javase / javase . jar : core / core . jar com . google . zxing . client . j2se . Co mmandL ineRun ner

/ home / alessandro / Immagini / scansioni /00000005 -50. png -- crop =1140 ,102 ,372 ,128
file :/ home / alessandro / Immagini / scansioni /00000005 -50. png ( format : CODE_39 , type : TEXT ):
Raw result :
18008
Parsed result :
18008
Also , there were 2 result points .
Point 0: (31.5 ,64.0)
Point 1: (345.5 ,64.0)

java - cp javase / javase . jar : core / core . jar com . google . zxing . client . j2se . Co mmandL ineRun ner

/ home / alessandro / Immagini / scansioni /00000005 -50. png -- crop =1312 ,294 ,938 ,156
file :/ home / alessandro / Immagini / scansioni /00000005 -50. png ( format : CODE_39 , type : TEXT ):
Raw result :
VRNGPP45H29E888T
Parsed result :
VRNGPP45H29E888T
Also , there were 2 result points .
Point 0: (59.0 ,78.0)
Point 1: (898.5 ,78.0)

java - cp javase / javase . jar : core / core . jar com . google . zxing . client . j2se . Co mmandL ineRun ner

/ home / alessandro / Immagini / scansioni /00000005 -50. png -- crop =1556 ,102 ,638 ,128
file :/ home / alessandro / Immagini / scansioni /00000005 -50. png ( format : CODE_39 , type : TEXT ):
Raw result :
0201161496
Parsed result :
0201161496
Also , there were 2 result points .
Point 0: (32.0 ,64.0)
Point 1: (610.5 ,64.0)

Conclusioni
Dopo aver analizzato il software e effettuato alcuni test, posso concludere che la libreria ZXing è valida, facilmente modificabile
e quindi adattabile a molteplici situazioni.