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 "2331112" ; # 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. #code 128 #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, as from the above code, into a photo image proc c128img {c128} { set offset 20 set scale 1 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 set offset 20 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 set sum 104 foreach char [split $data ""] { scan $char %c decimal incr decimal -32 set mult [expr $decimal * $pos] incr sum $mult #puts "$pos $mult $sum $char $decimal" incr pos } set sum [expr $sum % 103] if {$sum < 95} { incr sum 32 } else { incr sum 100 } set sum [binary format c $sum] return "\x88${data}${sum}\x8a" } # Demo: 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 ---- [Category Barcode]