Updated 2014-09-12 07:59:49 by ALX

This will become a "real" page - for now it's just a part of chat transcript (2003-07-09), so the info doesn't get lost... RS
``` suchenwi    But one basic question: in barcodes like Code 128 (EAN?), each digit is a black and a white bar, the added thickness of which two is constant, right?
kroc        Richard: each digit (or letter for some barcodes) is a set of bars and spaces...
suchenwi    How many?
kroc        it depends of barcode type.
kroc        Six per char for Code 128 for a total of 11 units.
kroc        Here is a sample :
B == bar and S == space
digit represents width.
char == BSBSBS
a = 121124
^ =  431111
etc..
kroc        So, graphic representation will be:
a = "X  X XX    "
^ = "XXXX   X X "
kroc        To build the barcode, you join all char bars and spaces. It also need start and end symbol, sometimes an ending control char, and must respect minimum width requirements to be read.
suchenwi    Ah - and for a quick shot one could draw canvas lines for the bars...
suchenwi    Check digit too, if I remember right.
kroc        It's more accurate to draw on a photo image like that :
foreach {bar space} \$code {
set larg [expr (\$bar * \$unit)+\$debut]
img-\$nbimg put #000000 -to \$debut 0 \$larg \$fin
set debut [expr (\$space*\$unit) + \$larg]
}
suchenwi    Do you have a link to specifications of the bar-space width patterns?
kroc        mb: to answer your question, ean8 and Code 128 aren't the same thing at all.
* kroc checking...
kroc        http://www.ean-int.org
kroc        http://www.barcodeisland.com/symbolgy.phtml```

Here is a proc that returns Code 128 bars and spaces for a given string :
``` proc String2C128 { signes } {
set code ""
foreach part [split \$signes {}] {
switch -- \$part {
\x20 {append code "212222" ; # 0 }
\x21 {append code "222122"}
\x22 {append code "222221"}
\x23 {append code "121223"}
\x24 {append code "121322"}
\x25 {append code "131222"}
\x26 {append code "122213"}
\x27 {append code "122312"}
\x28 {append code "132212"}
\x29 {append code "221213"}
\x2A {append code "221312" ; # 10 }
\x2B {append code "231212"}
\x2C {append code "112232"}
\x2D {append code "122132"}
\x2E {append code "122231"}
\x2F {append code "113222"}
\x30 {append code "123122"}
\x31 {append code "123221"}
\x32 {append code "223211"}
\x33 {append code "221132"}
\x34 {append code "221231" ; # 20 }
\x35 {append code "213212"}
\x36 {append code "223112"}
\x37 {append code "312131"}
\x38 {append code "311222"}
\x39 {append code "321122"}
\x3A {append code "321221"}
\x3B {append code "312212"}
\x3C {append code "322112"}
\x3D {append code "322211"}
\x3E {append code "212123" ; # 30 }
\x3F {append code "212321"}
\x40 {append code "232121"}
\x41 {append code "111323"}
\x42 {append code "131123"}
\x43 {append code "131321"}
\x44 {append code "112313"}
\x45 {append code "132113"}
\x46 {append code "132311"}
\x47 {append code "211313"}
\x48 {append code "231113" ; # 40 }
\x49 {append code "231311"}
\x4A {append code "112133"}
\x4B {append code "112331"}
\x4C {append code "132131"}
\x4D {append code "113123"}
\x4E {append code "113321"}
\x4F {append code "133121"}
\x50 {append code "313121"}
\x51 {append code "211331"}
\x52 {append code "231131" ; # 50 }
\x53 {append code "213113"}
\x54 {append code "213311"}
\x55 {append code "213131"}
\x56 {append code "311123"}
\x57 {append code "311321"}
\x58 {append code "331121"}
\x59 {append code "312113"}
\x5A {append code "312311"}
\x5B {append code "332111"}
\x5C {append code "314111" ; # 60 }
\x5D {append code "221411"}
\x5E {append code "431111"}
\x5F {append code "111224"}
\x60 {append code "111422"}
\x61 {append code "121124"}
\x62 {append code "121421"}
\x63 {append code "141122"}
\x64 {append code "141221"}
\x65 {append code "112214"}
\x66 {append code "112412" ; # 70 }
\x67 {append code "122114"}
\x68 {append code "122411"}
\x69 {append code "142112"}
\x6A {append code "142211"}
\x6B {append code "241211"}
\x6C {append code "221114"}
\x6D {append code "413111"}
\x6E {append code "241112"}
\x6F {append code "134111"}
\x70 {append code "111242" ; # 80 }
\x71 {append code "121142"}
\x72 {append code "121241"}
\x73 {append code "114212"}
\x74 {append code "124112"}
\x75 {append code "124211"}
\x76 {append code "411212"}
\x77 {append code "421112"}
\x78 {append code "421211"}
\x79 {append code "212141"}
\x7A {append code "214121" ; # 90 }
\x7B {append code "412121"}
\x7C {append code "111143"}
\x7D {append code "111341"}
\x7E {append code "131141"}
\x7F {append code "114113"}
\x80 {append code "114311"}
\x81 {append code "411113"}
\x82 {append code "411311"}
\x83 {append code "113141"}
\x84 {append code "114131" ; # 100 }
\x85 {append code "311141"}
\x86 {append code "411131" ; # FNC1 }
\x87 {append code "211412" ; # Start A }
\x88 {append code "211214" ; # Start B }
\x89 {append code "211232" ; # Start C }
\x8A {append code "23311121" ; # End }
}
}
return [split \$code {}]
}```

Spun off from here: Code 39 generation

Jan 19,2008 SRIV Heres the remainder of the code needed to generate Code128 B.

``` #One sees 6 parts in each symbol (3 bars, 3 gaps),  This part
#converts an input string into a bar-gap sequence, with added start,
#checksum and stop characters, followed by the termination bar
#This renders a bar-gap sequence into a photo image

proc c128img {c128} {
set offset 20 ; #add some whitespace to the left & right of the barcode as required
set scale 1 ;# change this to 2 for a 2X larger barcode
set width [expr {round(([string length \$c128] * \$scale) + \$offset)}]
set height 60
set im [image create photo -width \$width -height \$height]
\$im put white -to 0 0 \$width \$height

foreach {bar space} \$c128 {
set larg [expr (\$bar * \$scale)+\$offset]
\$im put #000000 -to \$offset 0 \$larg \$height
set offset [expr (\$space*\$scale) + \$larg]
}
set im
}

proc code128checksum {data} {
set pos 1
#change next line to 103 for code128A or 105 for code 128C
set sum 104
foreach char [split \$data ""] {
scan \$char %c decimal
incr decimal -32
set mult [expr \$decimal * \$pos]
incr sum \$mult
incr pos
}
set sum [expr \$sum % 103]
incr sum 32
set sum [binary format c \$sum]
#change the \x88 on next line to \x87 for Code128A or \x89 for code128C
return "\x88\${data}\${sum}\x8a"
}

# Demo:
package require Tk
set txt "ABCDE-12345"
set bc [String2C128 [code128checksum \$txt]]
set im [c128img \$bc]
label .l1 -anchor c -text  \$txt
label .l2 -anchor c -image \$im
pack  .l1 .l2```

ALX 2014-09-11 21:59:00:

tzint - tcl package for libzint barcode encoding library (no Tk needed)