Strichcode

  • Hallo zusammen.

    Ich habe mich mal gefragt, ob man nicht die Strichcodes auch selber erstellen kann. Dazu habe ich mir folgende Internetseite durchgelesen und versucht zu verstehen:
    http://de.wikipedia.org/wiki/European_Article_Number

    Dann habe ich erst einmal eine INI wie folgt erstellt, wobei S1, S2 und S3 durch AutoIt ausgewertet / berechnet / und eingetragen werden müßte:

    Spoiler anzeigen
    [autoit]


    #ce
    S1=
    S2=
    S3=

    [/autoit] [autoit][/autoit] [autoit]

    [C1]
    V=0111
    H=1110

    [/autoit] [autoit][/autoit] [autoit]

    [C2]
    M=11111

    [/autoit] [autoit][/autoit] [autoit]

    [0]
    U1=3211
    G1=1123
    U2=1123
    G2=3211

    [/autoit] [autoit][/autoit] [autoit]

    [1]
    U1=2221
    G1=1222
    U2=1222
    G1=2221

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    [2]
    U1=2122
    G1=2212
    U2=2212
    G2=2122

    [/autoit] [autoit][/autoit] [autoit]

    [3]
    U1=1411
    G1=1141
    U2=1141
    G2=1411

    [/autoit] [autoit][/autoit] [autoit]

    [4]
    U1=1132
    G1=2311
    U2=2311
    G2=1132

    [/autoit] [autoit][/autoit] [autoit]

    [5]
    U1=1231
    G1=1321
    U2=1321
    G2=1231

    [/autoit] [autoit][/autoit] [autoit]

    [6]
    U1=1114
    G1=4111
    U2=4111
    G2=1114

    [/autoit] [autoit][/autoit] [autoit]

    [7]
    U1=1312
    G1=2131
    U2=2131
    G2=1312

    [/autoit] [autoit][/autoit] [autoit]

    [8]
    U1=1213
    G1=3121
    U2=3121
    G2=1213

    [/autoit] [autoit][/autoit] [autoit]

    [9]
    U1=3112
    G1=2113
    U2=2113
    G2=3112

    [/autoit]

    Die INI erklärt sich wie folgt:

    Als Beispiel benutze ich die [012345678923] als Zahl


    [3] = Ich bin die erste 3 aus der Zahl 012345678923 und stehe an vierter stelle (also G1)
    U1 = 1., 3., 5. Stelle
    G1 = 2., 4., 6. Stelle
    U2 = 7., 9., 11. Stelle
    G2 = 8., 10. 12. Stelle
    S1 = Summe aller ungerader Stellen
    S2 = (Summe aller gerader Stellen) *3
    S3 = 90 - (S1+S2) Wird
    3211 = drei mal zehn weiße Pixel übereinander, dann zwei mal zehn schwarze, dann ein mal 10 weiße und dann 10 schwarze Pixel
    Ergebnis: autoit.de/wcf/attachment/10806/

    Und so würde die Zahl 1976 aussehen: autoit.de/wcf/attachment/10807/

    Aufgebaut wird es komplett so:
    [c1-v]123456[c2]789123[c1-H]-S3 (Das Minuszeichen vor S3 ist kein Berechnungszeichen sondern ein Trennzeichen.

    Meint ihr, das man es so umsetzen kann?

  • Ja, habe mir eine gebrauchten 0-8-15 gekauft.
    Werden später wohl alls aber sog. EAN-99, was jedoch das gleich ist als wenn die EAN-13 mit 99 beginnen würde.

    EAN-99 werden int. ja auch für den Archivierungsdienst verwendet, wenn auch einige den EAN-128 verwenden.

    Also nur mal zur Info, Der Billigscanner hat gerade mal € 59,45 gekostet. Okay, mit vielen Prozenten ;)

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Falls du die Funktion zur Erstellung des Barcodes aus der Nummer nicht selbst schreiben willst, kannst du im englischen Forum eine UDF dafür finden. Außerdem gibt es auch einen Codeschnipsel, der die Checksumme für einen Barcode berechnet, sodass du einfach eigene Barcodes generieren kannst.

    PS: statt 99X kannst du auch 2XX, eventuell auch 980, 981 oder 982 als "Länderkennung" verwenden ;)

  • Ich habe eben ein Script zum erstellen von EAN 13 Barcodes geschrieben.
    Ich hab mich mit dem Thema vorher noch nie befasst und ich muss sagen, dass der Wikipedia Artikel recht schlecht verständlich ist ;).
    Ist natürlich noch sehr verbesserungswürdig (Speichern als Bild, ordentliche GUI usw.) aber da hatte ich grad keine Lust drauf.
    Wie es mit den Maßen aussieht weis ich nicht. Ich kenne mich mit den Normen nicht aus. Auf jeden Fall hier der Code:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>
    #include <String.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $arr[10][2] = [['0001101', 'OOOOOO'],['0011001', 'OOEOEE'],['0010011', 'OOEEOE'],['0111101', 'OOEEEO'],['0100011', 'OEOOEE'],['0110001', 'OEEOOE'],['0101111', 'OEEEOO'],['0111011', 'OEOEOE'],['0110111', 'OEOEEO'],['0001011', 'OEEOEO']]
    Local $hGUI, $hGraphic, $hPen, $msg, $pruef, $ungerade = 0, $gerade = 0, $width = 2, $string = ''

    [/autoit] [autoit][/autoit] [autoit]

    Local $zahl = '445151616551' ; 12 Zeichen <-------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    If (StringLen($zahl) <> 12) Then
    MsgBox(0, "", "Zahl hat falsche Länge")
    Else
    $pattern = $arr[StringLeft($zahl, 1)][1]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To StringLen($zahl)
    If Mod($i, 2) = 0 Then
    $gerade += StringMid($zahl, $i, 1)
    Else
    $ungerade += StringMid($zahl, $i, 1)
    EndIf
    Next
    $pruef = $ungerade + 3 * $gerade
    If (StringRight($pruef, 1) = 0) Then
    $zahl &= 0
    Else
    $zahl &= 10 - StringRight($pruef, 1)
    EndIf
    $zahl = StringTrimLeft($zahl, 1)

    [/autoit] [autoit][/autoit] [autoit]

    $string &= '101'
    For $i = 1 To 6
    If (StringMid($pattern, $i, 1) = 'O') Then
    $string &= $arr[StringMid($zahl, $i, 1)][0]
    Else
    $string &= _EvenLeft($arr[StringMid($zahl, $i, 1)][0])
    EndIf
    Next
    $string &= '01010'
    For $i = 7 To 12
    $string &= _OddRight($arr[StringMid($zahl, $i, 1)][0])
    Next
    $string &= '101'
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Barcode", 95 * 2 + 60, 162 + 30)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hPen = _GDIPlus_PenCreate(0xFF000000, $width)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To StringLen($string)
    if (StringMid($string, $i, 1) = '1') Then _
    _GDIPlus_GraphicsDrawLine($hGraphic, $i * $width + 30, 30, $i * $width + 30, 162, $hPen)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _OddRight($digits)
    Local $buffer = ''
    For $i = 1 To 7
    if (StringMid($digits, $i, 1) = 0) Then
    $buffer &= '1'
    Else
    $buffer &= '0'
    EndIf
    Next
    Return $buffer
    EndFunc ;==>_OddRight

    [/autoit] [autoit][/autoit] [autoit]

    Func _EvenLeft($digits)
    Return _StringReverse(_OddRight($digits))
    EndFunc ;==>_EvenLeft

    [/autoit]

    Einmal editiert, zuletzt von anno2008 (27. Juli 2010 um 20:17)

  • WOW. Finde ich ja mal schnell geschrieben. "Speichern als Bild" wäre noch eine gute Idee. Dann könnte man die Bilder weiter verwenden z. B. in Excel oder Word oder wo immer man Bilder importieren kann. Sinnvoll wäre dann ja die 13 Stellen gleich als Dateiname zu verwenden.

    Frage mich ab und an, wie man etwas so schnell hinbekommen kann. ?!?!?!?!?

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Bei einer Null an einer 1., 3. , 5. Stelle bedeutet 3211:

    3 Pixel dicker weißer Balken (3x10)
    2 Pickel dicker schwarzer Balken ( 2x10)
    1 Pickel dicker weißer Balken (1x10)
    1 Pickel dicker schwarzer Streifen (1x10)

    An dieser Stelle ist die Null "odd". An zweiter Stelle wäre die Null "even" und die Strickcodestreifendicke wäre 1123

    0 = weiß
    X= schwarz

    0-odd: 0-even:
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX
    00XX0X 0X00XXX

    Und wie ich gerade erfahren habe, sind von Position 7-12 die Stellen alle "odd".

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    Einmal editiert, zuletzt von Alina (28. Juli 2010 um 01:26)

  • 3 Pixel dicker weißer Balken (3x10)
    2 Pickel dicker schwarzer Balken ( 2x10)
    1 Pickel dicker weißer Balken (1x10)
    1 Pickel dicker schwarzer Streifen (1x10)

    An dieser Stelle ist die Null "odd". An zweiter Stelle wäre die Null "even" und die Strickcodestreifendicke wäre 1123

    Ok, aber dann brauch man die Information der Strichdicken nicht um den Strichcode zu erstellen.

    Und wie ich gerade erfahren habe, sind von Position 7-12 die Stellen alle "odd".


    Ja, das ist ja logisch, das sieht man ja auch am Pattern, das durch das 13. Element (1. Element?) festgelegt wird.