Barcode128B

    • VB.NET

    Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

      Hallo Community,

      Da ich mich zur Zeit sehr für alltagsnahe Darstellung von Texten und Ähnlichem interessiere habe ich mich mal an eine Klasse gemacht die Text zu einem 128BBarcode Kodieren kann. Diese sind wie folgt aufgebaut:

      ' Startsequenz + Umkodierter Text + Prüfsequenz + Stopsequenz
      Startsequenz: bb w b ww b wwww
      Prüfsequenz: Den Wert der Zeichen * Gewichtung Mod 103
      Stopsequenz: bb www bbb w b w bb

      Das b steht hierbei für Black, also einen schwarzen Strich, w für Weiß. Die Leerzeichen dienen lediglich zur Gruppierung.
      Die einzelnen Sequenzen für Zeichen können hier eingesehen werden: hi-tier.de/Entwicklung/technik/barcode_Code128.html

      Hier die kommentierte Klasse(Da es sich um etwas eher simples handelt und wir hier im Sourcecodeautausch sind verzichte ich auf weitere Erläuterungen):
      BarCode128B.vb

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.Drawing
      3. Option Strict On
      4. Imports System.Drawing
      5. Public Class BarCode128B
      6. Private sign_dictonary As New Dictionary(Of Char, String)
      7. ''' <summary>
      8. ''' Lädt die Zeichen in das Wörterbuch
      9. ''' </summary>
      10. ''' <remarks></remarks>
      11. Private Sub Load_Dictonary()
      12. sign_dictonary.Clear()
      13. Add(" ", "bb w bb ww bb ww")
      14. Add("!", "bb ww bb w bb ww")
      15. Add("""", "bb ww bb ww bb w")
      16. Add("#", "b ww b ww bb www")
      17. Add("$", "b ww b www bb ww")
      18. Add("%", "b www b ww bb ww")
      19. Add("&", "b ww bb ww b www")
      20. Add("'", "b ww bb www b ww")
      21. Add("(", "b www bb ww b ww")
      22. Add(")", "bb ww b ww b www")
      23. Add("*", "bb ww b www b ww")
      24. Add("+", "bb www b ww b ww")
      25. Add(",", "b w bb ww bbb ww")
      26. Add("-", "b ww bb w bbb ww")
      27. Add(".", "b ww bb ww bbb w")
      28. Add("/", "b w bbb ww bb ww")
      29. Add("0", "b ww bbb w bb ww")
      30. Add("1", "b ww bbb ww bb w")
      31. Add("2", "bb ww bbb ww b w")
      32. Add("3", "bb ww b w bbb ww")
      33. Add("4", "bb ww b ww bbb w")
      34. Add("5", "bb w bbb ww b ww")
      35. Add("6", "bb ww bbb w b ww")
      36. Add("7", "bbb w bb w bbb w")
      37. Add("8", "bbb w b ww bb ww")
      38. Add("9", "bbb ww b w bb ww")
      39. Add(":", "bbb ww b ww bb w")
      40. Add(";", "bbb w bb ww b ww")
      41. Add("<", "bbb ww bb w b ww")
      42. Add("=", "bbb ww bb ww b w")
      43. Add(">", "bb w bb w bb www")
      44. Add("?", "bb w bb www bb w")
      45. Add("@", "bb www bb w bb w")
      46. Add("A", "b w b www bb www")
      47. Add("B", "b www b w bb www")
      48. Add("C", "b www b www bb w")
      49. Add("D", "b w bb www b www")
      50. Add("E", "b www bb w b www")
      51. Add("F", "b www bb www b w")
      52. Add("G", "bb w b www b www")
      53. Add("H", "bb www b w b www")
      54. Add("I", "bb www b www b w")
      55. Add("J", "b w bb w bbb www")
      56. Add("K", "b w bb www bbb w")
      57. Add("L", "b www bb w bbb w")
      58. Add("M", "b w bbb w bb www")
      59. Add("N", "b w bbb www bb w")
      60. Add("O", "b www bbb w bb w")
      61. Add("P", "bbb w bbb w bb w")
      62. Add("Q", "bb w b www bbb w")
      63. Add("R", "bb www b w bbb w")
      64. Add("S", "bb w bbb w b www")
      65. Add("T", "bb w bbb www b w")
      66. Add("U", "bb w bbb w bbb w")
      67. Add("V", "bbb w b w bb www")
      68. Add("W", "bbb w b www bb w")
      69. Add("X", "bbb www b w bb w")
      70. Add("Y", "bbb w bb w b www")
      71. Add("Z", "bbb w bb www b w")
      72. Add("[", "bbb www bb w b w")
      73. Add("", "bbb w bbbb w b w")
      74. Add("]", "bb ww b wwww b w")
      75. Add("^", "bbbb www b w b w")
      76. Add("_", "b w b ww bb wwww")
      77. Add("`", "b w b wwww bb ww")
      78. Add("a", "b ww b w bb wwww")
      79. Add("b", "b ww b wwww bb w")
      80. Add("c", "b wwww b w bb ww")
      81. Add("d", "b wwww b ww bb w")
      82. Add("e", "b w bb ww b wwww")
      83. Add("f", "b w bb wwww b ww")
      84. Add("g", "b ww bb w b wwww")
      85. Add("h", "b ww bb wwww b w")
      86. Add("i", "b wwww bb w b ww")
      87. Add("j", "b wwww bb ww b w")
      88. Add("k", "bb wwww b ww b w")
      89. Add("l", "bb ww b w b wwww")
      90. Add("m", "bbbb w bbb w b w")
      91. Add("n", "bb wwww b w b ww")
      92. Add("o", "b www bbbb w b w")
      93. Add("p", "b w b ww bbbb ww")
      94. Add("q", "b ww b w bbbb ww")
      95. Add("r", "b ww b ww bbbb w")
      96. Add("s", "b w bbbb ww b ww")
      97. Add("t", "b ww bbbb w b ww")
      98. Add("u", "b ww bbbb ww b w")
      99. Add("v", "bbbb w b ww b ww")
      100. Add("w", "bbbb ww b w b ww")
      101. Add("x", "bbbb ww b ww b w")
      102. Add("y", "bb w bb w bbbb w")
      103. Add("z", "bb w bbbb w bb w")
      104. Add("{", "bbbb w bb w bb w")
      105. Add("|", "b w b w bbbb www")
      106. Add("}", "b w b www bbbb w")
      107. Add("~", "b www b w bbbb w")
      108. End Sub
      109. ''' <summary>
      110. ''' Verkürzung von sign_dictonary.Add()
      111. ''' </summary>
      112. ''' <param name="char"></param>
      113. ''' <param name="code"></param>
      114. ''' <remarks></remarks>
      115. Private Sub Add(ByVal [char] As String, ByVal code As String)
      116. sign_dictonary.Add(CChar([char]), code)
      117. End Sub
      118. #Region "Encoder"
      119. ''' <summary>
      120. ''' Gibt Index des Zeichens zurück
      121. ''' </summary>
      122. ''' <param name="char"></param>
      123. ''' <returns></returns>
      124. ''' <remarks></remarks>
      125. Private Function GetIndex(ByVal [char] As Char) As Integer
      126. For u As Integer = 0 To sign_dictonary.Count - 1
      127. If sign_dictonary.Keys(u) = [char] Then
      128. Return u
      129. End If
      130. Next
      131. End Function
      132. ''' <summary>
      133. ''' Konvertiert eine Zeichenfolge in Black and White Stripes
      134. ''' </summary>
      135. ''' <param name="text">Zu Übersetzender Text</param>
      136. ''' <returns></returns>
      137. ''' <remarks></remarks>
      138. Private Function Convert(ByVal text As String) As String
      139. Load_Dictonary()
      140. Dim returnstring As String = ""
      141. Dim prüfsumme As Double = 0
      142. Dim gewichtung As Integer = 1
      143. For Each cr As Char In text
      144. returnstring = returnstring & " " & sign_dictonary(cr)
      145. prüfsumme = prüfsumme + GetIndex(cr) * gewichtung
      146. gewichtung = gewichtung + 1
      147. Next
      148. prüfsumme = prüfsumme + 104
      149. Dim prüfsummenmod As Integer = CInt(prüfsumme Mod 103)
      150. Dim prüfensummenkodierung As String = sign_dictonary(sign_dictonary.Keys(prüfsummenmod))
      151. 'Beginncode & TextCode & StopCode
      152. Return ("bb w b ww b wwww" & returnstring.Substring(1, returnstring.Length - 1) & prüfensummenkodierung & "bb www bbb w b w bb").Replace(" ", "")
      153. End Function
      154. ''' <summary>
      155. ''' Kodiert eine Zeichenfolge in einen 128B-Barcode
      156. ''' </summary>
      157. ''' <param name="text">Der darzustellende Text</param>
      158. ''' <param name="height">Die Höhe des Barcodes</param>
      159. ''' <returns></returns>
      160. ''' <remarks></remarks>
      161. Public Function Encode(ByVal text As String, ByVal height As Integer) As Bitmap
      162. Dim kombination As String = Convert(text)
      163. Dim bmp As New Bitmap((kombination.Length), height)
      164. Dim gr As Graphics = Graphics.FromImage(bmp)
      165. With gr
      166. .SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
      167. .TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
      168. .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
      169. .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
      170. .CompositingQuality = Drawing2D.CompositingQuality.HighQuality
      171. End With
      172. For u As Integer = 0 To kombination.Length - 1
      173. If kombination.Substring(u, 1) = "w" Then
      174. gr.FillRectangle(Brushes.White, New Rectangle(u, 0, 1, height))
      175. End If
      176. If kombination.Substring(u, 1) = "b" Then
      177. gr.FillRectangle(Brushes.Black, New Rectangle(u, 0, 1, height))
      178. End If
      179. Next
      180. Return bmp
      181. End Function
      182. #End Region
      183. End Class


      Verwendung:

      VB.NET-Quellcode

      1. Dim barcoder as New BarCode128B
      2. PictureBox1.Image = barcoder.Encode("Test",50)



      Um die Dekodierungsfunktion werde ich mich im Laufe der nächsten Woche kümmern :). Hoffe jemand kann was damit anfangen.

      Greetz faxe1008
      Bilder
      • Klassendiagramm.jpg

        13,71 kB, 148×171, 896 mal angesehen
      Dateien
      • BarCode128B.vb

        (6,28 kB, 321 mal heruntergeladen, zuletzt: )

      8-) faxe1008 8-)

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „faxe1008“ ()

      Hier nun die Dekodierung - war einfacher als gedacht :). Ich habe die Klasse noch ein bisschen mit Regions gegliedert um es mit Foldingmarkers ein bzw. ausklappbar zu machen. Ich habe hier bewusst Bitmap.getPixel verwendet, da ich bei einer Bitmap, die eine Width von 100 hat, auch nur dieselbe Anzahl an Pixel prüfen muss. In einem Testprojekt mit einer Stopwatch dauerte ein solcher Dekodierungsvorgang lediglich 4 Millisekunden, was glaube ich verschmerzbar ist :D .

      Barcode128B.vb

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System.Drawing
      3. Public Class BarCode128B
      4. Private sign_dictonary As New Dictionary(Of Char, String)
      5. ''' <summary>
      6. ''' Lädt die Zeichen in das Wörterbuch
      7. ''' </summary>
      8. ''' <remarks></remarks>
      9. Private Sub Load_Dictionary()
      10. sign_dictonary.Clear()
      11. Add(" ", "bb w bb ww bb ww")
      12. Add("!", "bb ww bb w bb ww")
      13. Add("""", "bb ww bb ww bb w")
      14. Add("#", "b ww b ww bb www")
      15. Add("$", "b ww b www bb ww")
      16. Add("%", "b www b ww bb ww")
      17. Add("&", "b ww bb ww b www")
      18. Add("'", "b ww bb www b ww")
      19. Add("(", "b www bb ww b ww")
      20. Add(")", "bb ww b ww b www")
      21. Add("*", "bb ww b www b ww")
      22. Add("+", "bb www b ww b ww")
      23. Add(",", "b w bb ww bbb ww")
      24. Add("-", "b ww bb w bbb ww")
      25. Add(".", "b ww bb ww bbb w")
      26. Add("/", "b w bbb ww bb ww")
      27. Add("0", "b ww bbb w bb ww")
      28. Add("1", "b ww bbb ww bb w")
      29. Add("2", "bb ww bbb ww b w")
      30. Add("3", "bb ww b w bbb ww")
      31. Add("4", "bb ww b ww bbb w")
      32. Add("5", "bb w bbb ww b ww")
      33. Add("6", "bb ww bbb w b ww")
      34. Add("7", "bbb w bb w bbb w")
      35. Add("8", "bbb w b ww bb ww")
      36. Add("9", "bbb ww b w bb ww")
      37. Add(":", "bbb ww b ww bb w")
      38. Add(";", "bbb w bb ww b ww")
      39. Add("<", "bbb ww bb w b ww")
      40. Add("=", "bbb ww bb ww b w")
      41. Add(">", "bb w bb w bb www")
      42. Add("?", "bb w bb www bb w")
      43. Add("@", "bb www bb w bb w")
      44. Add("A", "b w b www bb www")
      45. Add("B", "b www b w bb www")
      46. Add("C", "b www b www bb w")
      47. Add("D", "b w bb www b www")
      48. Add("E", "b www bb w b www")
      49. Add("F", "b www bb www b w")
      50. Add("G", "bb w b www b www")
      51. Add("H", "bb www b w b www")
      52. Add("I", "bb www b www b w")
      53. Add("J", "b w bb w bbb www")
      54. Add("K", "b w bb www bbb w")
      55. Add("L", "b www bb w bbb w")
      56. Add("M", "b w bbb w bb www")
      57. Add("N", "b w bbb www bb w")
      58. Add("O", "b www bbb w bb w")
      59. Add("P", "bbb w bbb w bb w")
      60. Add("Q", "bb w b www bbb w")
      61. Add("R", "bb www b w bbb w")
      62. Add("S", "bb w bbb w b www")
      63. Add("T", "bb w bbb www b w")
      64. Add("U", "bb w bbb w bbb w")
      65. Add("V", "bbb w b w bb www")
      66. Add("W", "bbb w b www bb w")
      67. Add("X", "bbb www b w bb w")
      68. Add("Y", "bbb w bb w b www")
      69. Add("Z", "bbb w bb www b w")
      70. Add("[", "bbb www bb w b w")
      71. Add("", "bbb w bbbb w b w")
      72. Add("]", "bb ww b wwww b w")
      73. Add("^", "bbbb www b w b w")
      74. Add("_", "b w b ww bb wwww")
      75. Add("`", "b w b wwww bb ww")
      76. Add("a", "b ww b w bb wwww")
      77. Add("b", "b ww b wwww bb w")
      78. Add("c", "b wwww b w bb ww")
      79. Add("d", "b wwww b ww bb w")
      80. Add("e", "b w bb ww b wwww")
      81. Add("f", "b w bb wwww b ww")
      82. Add("g", "b ww bb w b wwww")
      83. Add("h", "b ww bb wwww b w")
      84. Add("i", "b wwww bb w b ww")
      85. Add("j", "b wwww bb ww b w")
      86. Add("k", "bb wwww b ww b w")
      87. Add("l", "bb ww b w b wwww")
      88. Add("m", "bbbb w bbb w b w")
      89. Add("n", "bb wwww b w b ww")
      90. Add("o", "b www bbbb w b w")
      91. Add("p", "b w b ww bbbb ww")
      92. Add("q", "b ww b w bbbb ww")
      93. Add("r", "b ww b ww bbbb w")
      94. Add("s", "b w bbbb ww b ww")
      95. Add("t", "b ww bbbb w b ww")
      96. Add("u", "b ww bbbb ww b w")
      97. Add("v", "bbbb w b ww b ww")
      98. Add("w", "bbbb ww b w b ww")
      99. Add("x", "bbbb ww b ww b w")
      100. Add("y", "bb w bb w bbbb w")
      101. Add("z", "bb w bbbb w bb w")
      102. Add("{", "bbbb w bb w bb w")
      103. Add("|", "b w b w bbbb www")
      104. Add("}", "b w b www bbbb w")
      105. Add("~", "b www b w bbbb w")
      106. End Sub
      107. ''' <summary>
      108. ''' Verkürzung von sign_dictonary.Add()
      109. ''' </summary>
      110. ''' <param name="char"></param>
      111. ''' <param name="code"></param>
      112. ''' <remarks></remarks>
      113. Private Sub Add(ByVal [char] As String, ByVal code As String)
      114. sign_dictonary.Add(CChar([char]), code)
      115. End Sub
      116. #Region "Encoder"
      117. ''' <summary>
      118. ''' Gibt Index des Zeichens zurück
      119. ''' </summary>
      120. ''' <param name="char"></param>
      121. ''' <returns></returns>
      122. ''' <remarks></remarks>
      123. Private Function GetIndex(ByVal [char] As Char) As Integer
      124. For u As Integer = 0 To sign_dictonary.Count - 1
      125. If sign_dictonary.Keys(u) = [char] Then
      126. Return u
      127. End If
      128. Next
      129. End Function
      130. ''' <summary>
      131. ''' Konvertiert eine Zeichenfolge in Black and White Stripes
      132. ''' </summary>
      133. ''' <param name="text">Zu Übersetzender Text</param>
      134. ''' <returns></returns>
      135. ''' <remarks></remarks>
      136. Private Function Convert(ByVal text As String) As String
      137. Load_Dictionary()
      138. Dim returnstring As String = ""
      139. Dim prüfsumme As Double = 0
      140. Dim gewichtung As Integer = 1
      141. For Each cr As Char In text
      142. returnstring = returnstring & " " & sign_dictonary(cr)
      143. prüfsumme = prüfsumme + GetIndex(cr) * gewichtung
      144. gewichtung = gewichtung + 1
      145. Next
      146. prüfsumme = prüfsumme + 104
      147. Dim prüfsummenmod As Integer = CInt((prüfsumme Mod 103))
      148. Dim prüfensummenkodierung As String = sign_dictonary(sign_dictonary.Keys(prüfsummenmod))
      149. 'Beginncode & TextCode & StopCode
      150. Return ("bb w b ww b wwww" & returnstring.Substring(1, returnstring.Length - 1) & prüfensummenkodierung & "bb www bbb w b w bb").Replace(" ", "")
      151. End Function
      152. ''' <summary>
      153. ''' Kodiert eine Zeichenfolge in einen 128B-Barcode
      154. ''' </summary>
      155. ''' <param name="text">Der darzustellende Text</param>
      156. ''' <param name="height">Die Höhe des Barcodes</param>
      157. ''' <returns></returns>
      158. ''' <remarks></remarks>
      159. Public Function Encode(ByVal text As String, ByVal height As Integer) As Bitmap
      160. Dim kombination As String = Convert(text)
      161. Dim bmp As New Bitmap((kombination.Length), height)
      162. Dim gr As Graphics = Graphics.FromImage(bmp)
      163. With gr
      164. .SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
      165. .TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias
      166. .PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
      167. .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBilinear
      168. .CompositingQuality = Drawing2D.CompositingQuality.HighQuality
      169. End With
      170. For u As Integer = 0 To kombination.Length - 1
      171. If kombination.Substring(u, 1) = "w" Then
      172. gr.FillRectangle(Brushes.White, New Rectangle(u, 0, 1, height))
      173. End If
      174. If kombination.Substring(u, 1) = "b" Then
      175. gr.FillRectangle(Brushes.Black, New Rectangle(u, 0, 1, height))
      176. End If
      177. Next
      178. Return bmp
      179. End Function
      180. #End Region
      181. #Region "Decoder"
      182. ''' <summary>
      183. ''' Filtert die Kombination von weißen und schwarzen Stripes aus der BMP
      184. ''' </summary>
      185. ''' <param name="bmp">Bitmap, die den Barcode enthält</param>
      186. ''' <returns>Black und White Bar Kombination</returns>
      187. ''' <remarks></remarks>
      188. Private Function Get_Combination(ByVal bmp As Bitmap) As String
      189. Dim kombination As String = ""
      190. For u As Integer = 0 To bmp.Width - 1
      191. If bmp.GetPixel(u, 1) = Color.FromArgb(0, 0, 0) Then
      192. kombination = kombination + "b"
      193. End If
      194. If bmp.GetPixel(u, 1) = Color.FromArgb(255, 255, 255) Then
      195. kombination = kombination + "w"
      196. End If
      197. Next
      198. Return kombination
      199. End Function
      200. ''' <summary>
      201. ''' Bildet 11er Gruppen aus dem String
      202. ''' </summary>
      203. ''' <param name="combination">die Kombination der Black und White Bars</param>
      204. ''' <returns>Liste der 11er Gruppen</returns>
      205. ''' <remarks></remarks>
      206. Private Function Build_Groups(ByVal combination As String) As List(Of String)
      207. Dim kombinationen As New List(Of String)
      208. For u = 0 To CInt((combination.Length / 11) - 1)
      209. kombinationen.Add(combination.Substring(u * 11, 11))
      210. Next
      211. Return kombinationen
      212. End Function
      213. ''' <summary>
      214. ''' Findet den Key anhand des Values
      215. ''' </summary>
      216. ''' <param name="combination"></param>
      217. ''' <returns>Key des Dictionary</returns>
      218. ''' <remarks></remarks>
      219. Private Function Get_Key_By_Value(ByVal combination As String) As Char
      220. For u = 0 To sign_dictonary.Count - 1
      221. If sign_dictonary(sign_dictonary.Keys(u)).Replace(" ", "") = combination Then
      222. Return sign_dictonary.Keys(u)
      223. End If
      224. Next
      225. End Function
      226. ''' <summary>
      227. ''' Dekodiert eine Bitmap zu Text
      228. ''' </summary>
      229. ''' <param name="bmp">Die zu dekodierende Bitmap</param>
      230. ''' <returns>Den dekodierten Text</returns>
      231. ''' <remarks></remarks>
      232. Public Function Decode(ByVal bmp As Bitmap) As String
      233. Load_Dictionary()
      234. Dim groups = Build_Groups(Get_Combination(bmp))
      235. Dim decodedstring As String = ""
      236. For u As Integer = 1 To groups.Count - 3
      237. decodedstring = decodedstring + Get_Key_By_Value(groups(u))
      238. Next
      239. Return decodedstring
      240. End Function
      241. #End Region
      242. End Class


      Hier das erneuerte Klassendiagramm:


      Und für diejenigen, die es einfach mal schnell testen wollen habe ich ein Testprogramm angehängt :) . Ich werde weitere Kodierungsklassen schreiben (vllt. QRCode o.ä.) und euch dann ebenfalls zur Verfügung stellen, in der Hoffnung das jemand es brauchen kann.

      Greetz Fabian
      Dateien
      • BarCode-128B.rar

        (86,12 kB, 150 mal heruntergeladen, zuletzt: )

      8-) faxe1008 8-)
      Interessantes Projekt, aber beim Decoder hab ich meine Zweifel, dass der praktikabel ist.

      Denn Barcodes, die dekodiert werden sollen, kommen in den seltensten Fällen als glasklare Bitmap, sondern meist als Scan oder Foto.
      Das bedeutet, dass die schwarzen Balken von den weißen Zwischenräumen nicht mehr so klar abgegrenzt sind, dass man einfach Pixel für Pixel durchgehen kann. Zudem wird der Barcode rein theoretisch in beliebigen Winkeln, mindestens aber mit ein paar Grad "Tilt" abgelichtet. ;)
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.
      Die Klasse dient ja dem Dekodieren von Barcodes, die richtig "gedreht" sind. Falls dies nicht der Fall ist kannst du es ja mit RotateTransform so drehen, dass es lesbar ist ;). Die Qualität des Bildes hängt nun mal vom Drucker/Scanner ab und da kann ich mit der Klasse nichts dran ändern.
      So eben ist mir noch eine Sache eingefallen, die vielleicht noch interessant wäre. Eine Funktion die anhand der Prüfsequenz zurückgibt ob es sich um einen gültigen Barcode handelt.

      8-) faxe1008 8-)
      @nafets3646:
      Weil es von sehr vielen Faktoren abhängt:
      Ist das Bild vollständig?
      Wurde möglicherweise gezoomt, wodurch ein Bar dann größer als 1 Pixel wäre?
      Wurde das Blatt mit farbigem Licht angestrahlt, wodurch sich die Farbwerte ändern?
      Passt der Winkel des Barcodes, so dass eine lesbare Bitmap vorliegt?

      8-) faxe1008 8-)
      Könnte, man aber das löst dieses Problem leider nicht:

      faxe1008 schrieb:

      Wurde möglicherweise gezoomt, wodurch ein Bar dann größer als 1 Pixel wäre?


      Denn selbst wenn es richtig gedreht wäre würde der Decoder nicht wissen ob z.B. bb auf einen Fehler des Zoomens zurückzuführen ist, oder ob es sich wirklich um zwei schwarze Bars handelt. Denn in Wirklichkeit könnte es ein stark vergrößerter Bar sein, der nun mehrere Pixel einnimmt.

      Aber Falls du eine Lösung dieses Problemes findest, kannst du sie uns gerne präsentieren :) .

      8-) faxe1008 8-)
      Hm, mal sehen...

      Zunächst das Problem mit dem fehlenden Kontrast bzw. andersfarbigem Hintergrund: Bild in Graustufen umwandeln. Nach Möglichkeit auch mit der RGB-Gewichtung, die kürzlich erst in einem anderen Thread thematisiert wurde (R=0.3, G=0.59, B=0.11). Damit kann man dann alles schön in "schwarz und weiß" auseinander dividieren.

      Dann versucht man im Bild die Lage der Streifen zu analysieren. Das wird vermutlich der aufwändigste Part. Am Ende sollte man einen Winkel und das Barcode-relevante Rechteck haben. Mit dieser Info nimmt man am besten wieder das Original, dreht es entsprechend und schneidet dann das Rechteck aus, bevor man hier wieder mit Hilfe der Graustufen-Informationen ein schwarz-weiß-Bild draus macht.

      Ab hier hast du dann ein Bild, bei dem du wieder eine einzelne Pixelzeile betrachten kannst, aber berücksichtigen musst, dass der Barcode ggf. um 180 Grad gedreht ist.

      Auch nicht ganz trivial ist jetzt die Interpretation dieser Pixel, weil du jetzt in mehreren Versuchen testen musst, mit welchen Zoomfaktor bzw. Balkenabstand du einen gültigen Barcode auslesen kannst. Das Schwierigstee daran wird vermutlich sein, dass durch die Hau-Ruck-Methode, mit der ein Anti-Aliasing zurückgebrochen wird, zwei Balken, die "theoretisch" gleich breit sein müssten, in der Breite um 1 oder 2 Pixel voneinander abweichen können.
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.
      @Arby
      Ich denke, man kann das mit den Streifen auch so machen, dass man einfach entlang einer Linie von links nach rechts geht und dann versucht, eine ungefähre Breite für den Streifen zu ermitteln.
      @Kevin Hombre
      Es geht ja nicht darum, dass vom Computer generierte Barcodes gefunden werden sondern dass fotografierte Barcodes oder ähnliches gefunden werden können.

      nafets3646 schrieb:

      @Arby
      Ich denke, man kann das mit den Streifen auch so machen, dass man einfach entlang einer Linie von links nach rechts geht und dann versucht, eine ungefähre Breite für den Streifen zu ermitteln.

      Ja, das dürfte vermutlich sogar einfacher sein als ich zunächst angenommen hatte. Denn wenn ich den Barcode richtig gedeutet habe, dann sind die schwarzen Balken und die weißen Zwischenräume dazwischen immer nur jeweils ein, zwei oder drei Einheiten breit.

      @Kevin Hombre:
      Das funktioniert aber spätestens dann nicht, wenn ein "weißer" Pixel nicht weiß, sondern hellgrau ist oder - z.B. durch Beleuchtung auf einem Foto - gelb oder gar rot ist.
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.
      Ich hab mal was versucht, momentan muss man zwar noch alles manuell auswählen, jedoch geht die Analyse schon einigermaßen. Hier mal ein Screenshot der Anwendung:

      Ich denke mal nicht, dass es so schwer sein wird (@faxe1008). Der Barcode ist zwar mit ziemlich guter Qualität, das wäre aber ein möglicher Anfang. Immerhin erkennt man schon die grundsätzlichen Linien im Diagramm unten. Ich versuche mich gerade noch an einem Filter, welcher die Ergebnisse weiter filtert. Für die, die es interessiert: Für die Analyse wird alles im orangen Bereich analysiert (um Ungenauigkeiten zu vermeiden), die rote Linie markiert hier den Teil, der am stärksten gewichtet wird. Den Code habe ich aus dem Internet.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nafets3646“ ()

      Sieht doch schon gut aus. Die Aufgabenstellung beginnt, mich zu reizen... mal sehen, vielleicht bastel ich da auch mal was, wenn ich Zeit habe. Ich hab ne Idee wie man evtl. ohne vorheriges Rotieren der Bitmap und Suchen des Barcode-Bereichs auskommen kann.
      Weltherrschaft erlangen: 1%
      Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
      Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
      Danke.