Version 5 of Barcode generation

Updated 2003-07-10 19:31:32

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