Barcode zeichnen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Joshi.

    Haudruferzappeltnoch schrieb:

    Ich hab da auch farbige Striche zwischen den schwarzen.
    Bei mir auch.
    Da musst Du mal mit e.Graphics.InterpolationMode (2x) und der tatsächlichen Pixel-Vergrößerung beim Drucken und der Fontgröße spielen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich versuche das noch ein bissel zu verstehen, ich habe jetzt mal folgendes gemacht: Ich erstelle eine Klasse, die für mich zeichnet, dort erzeuge ich zum Test eie Bitmap und zeichne auf diese Bitmap.
    Dann lasse ich im Anschluss nur diese Bitmap zeichnen auf dem PrintDocument. Ich denke da ist schon irgendeine Verzerrung am Werk.

    VB.NET-Quellcode

    1. Friend Sub New()
    2. bmp = New Bitmap(150, 150)
    3. _graphics = Graphics.FromImage(bmp)
    4. _graphics.DrawString("Hallo Test", Arial10, Brushes.Black, New PointF(0, 0))
    5. End Sub
    6. Friend Sub Draw(G As Graphics, x As Integer, y As Integer) 'Graphics des PrintDocument werden übergeben, x = 100, y = 50
    7. G.DrawString("Hallo Test", Arial10, Brushes.Black, New PointF(100, 70)) 'Vergleich wie es sonst aussieht
    8. G.DrawImage(bmp, x, y)
    9. End Sub


    Resultat:


    Kann man das irgendwie fixen? Dann würde ich vermutlich auch mit dem Rest hinkommen.
    Hallo,

    ich verwende dafür Zxing.
    github.com/micjahn/ZXing.Net

    Gibt es auch als Nuget-Paket

    Auf der Form habe ich ein Panel (panel_Print) und ein eine Picturebox (picCode_Print)

    VB.NET-Quellcode

    1. Imports System.Drawing.Drawing2D
    2. Imports System.Runtime.InteropServices
    3. Imports ZXing
    4. Public Class egal
    5. <DllImport("gdi32.dll")>
    6. Private Shared Function BitBlt(ByVal hdc As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hdcSrc As IntPtr, ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean
    7. End Function
    8. Function GetImageFromControl(ByVal ctr As Control) As Image
    9. Dim rect As Rectangle = ctr.ClientRectangle
    10. Dim bmp As New Bitmap(rect.Width, rect.Height)
    11. Dim gbmp As Graphics = Graphics.FromImage(bmp)
    12. Dim hdcBmp As IntPtr = gbmp.GetHdc
    13. Dim gMe As Graphics = ctr.CreateGraphics
    14. Dim hdcMe As IntPtr = gMe.GetHdc
    15. BitBlt(hdcBmp, 0, 0, rect.Width, rect.Height, hdcMe, 0, 0, &HCC0020)
    16. gbmp.ReleaseHdc(hdcBmp)
    17. gMe.ReleaseHdc(hdcMe)
    18. Return bmp
    19. End Function
    20. Private Sub RenderBarcode_Code128(content As String, Optional pixelSize As Integer = 9)
    21. 'Alle vorhandenen Bilder entfernen
    22. picCode_Print.Image = Nothing
    23. Dim writer_print As ZXing.BarcodeWriter = New BarcodeWriter
    24. writer_print.Format = BarcodeFormat.CODE_128
    25. writer_print.Options.Height = 40
    26. writer_print.Options.PureBarcode = False
    27. Dim bmp_print As Bitmap = writer_print.Write(content)
    28. picCode_Print.Image = bmp_print
    29. End Sub
    30. Private Sub Drucken() Handles btnPrint.Click
    31. Try
    32. Dim pd As Printing.PrintDocument = New Printing.PrintDocument
    33. AddHandler pd.PrintPage, AddressOf pd_PrintPage
    34. pd.PrinterSettings.PrinterName = "SGM42_Printserver_Labeldrucker"
    35. If pd.PrinterSettings.IsValid Then
    36. pd.Print()
    37. Else
    38. MessageBox.Show("Printer is invalid")
    39. End If
    40. Catch ex As Exception
    41. MessageBox.Show(ex.Message)
    42. Finally
    43. End Try
    44. End Sub
    45. Private Sub pd_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
    46. Dim bmp As Bitmap = GetImageFromControl(panel_Print)
    47. Dim g As Graphics = e.Graphics
    48. g.InterpolationMode = InterpolationMode.NearestNeighbor
    49. g.PixelOffsetMode = PixelOffsetMode.HighQuality
    50. g.CompositingQuality = CompositingQuality.HighQuality
    51. g.DrawImage(bmp, 0, 0)
    52. End Sub
    53. Private Sub RenderBarcode_QR(content As String, Optional pixelSize As Integer = 8)
    54. 'Alle vorhandenen Bilder entfernen
    55. picCode_Print.Image = Nothing
    56. Dim writer_print As BarcodeWriter = New BarcodeWriter
    57. writer_print.Format = BarcodeFormat.QR_CODE
    58. writer_print.Options.Height = 75
    59. writer_print.Options.Width = 75
    60. writer_print.Options.PureBarcode = True
    61. Dim bmp_print As Bitmap = writer_print.Write(content)
    62. picCode_Print.Image = bmp_print
    63. End Sub
    64. Private Sub RenderBarcode_Datamatrix(content As String, Optional pixelSize As Integer = 9)
    65. 'Alle vorhandenen Bilder entfernen
    66. picCode_Print.Image = Nothing
    67. Dim writer_print As BarcodeWriter = New BarcodeWriter
    68. writer_print.Format = BarcodeFormat.DATA_MATRIX
    69. writer_print.Options.Height = 50
    70. writer_print.Options.PureBarcode = True
    71. Dim bmp_print As Bitmap = writer_print.Write(content)
    72. picCode_Print.Image = bmp_print
    73. End Sub
    74. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles btnQRCode.Click
    75. RenderBarcode_QR("A29769021009051")
    76. End Sub
    77. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles btnCode128.Click
    78. RenderBarcode_Code128("A29769021009051")
    79. End Sub
    80. End Class


    Gruß

    Haudruferzappeltnoch schrieb:

    VB.NET-Quellcode

    1. bmp = New Bitmap(150, 150)
    Speichere die Bitmap und sieh sie Dir an:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. 'bmp.Save("d:\temp\barcode.png") ' Testausgabe
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Haudruferzappeltnoch schrieb:

    Hm ich hab das Ganze auf ne PictureBox gemalt, dann kommt da auch ein Barcode bei rum, dann wollte ich das als Bild auf mein PrintDocument packen, aber da verschwindet der Barcode diesmal ganz.
    Da hilft mein bei mir beliebter Delay-Workaround
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Friend Class Form1
    2. Private Barcode As Font = Nothing
    3. Private PrepBitmap As New Bitmap(350, 300)
    4. Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim privateFonts As New Text.PrivateFontCollection()
    6. privateFonts.AddFontFile("Code39r.ttf")
    7. Barcode = New Font(privateFonts.Families(0), 36)
    8. picBCode.Invalidate() '1. die PicBox neu zeichnen lassen
    9. Await Threading.Tasks.Task.Delay(1)
    10. PrintPreviewControl1.InvalidatePreview()
    11. End Sub
    12. Private Sub picBCode_Paint(sender As Object, e As PaintEventArgs) Handles picBCode.Paint
    13. e.Graphics.DrawString("1234567890", Barcode, Brushes.Black, New Point(20, 40))
    14. picBCode.DrawToBitmap(PrepBitmap, New Rectangle(0, 0, 350, 300)) '2. Bitmap kopieren
    15. End Sub
    16. Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    17. e.Graphics.DrawImage(PrepBitmap, 10, 10) '3. kopierte Bitmap verwenden
    18. End Sub
    19. End Class
    Bilder
    • Result.png

      5,67 kB, 789×475, 37 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi.

    Für alle Optimierer, die mit Barcodes und Graphics-Objekten arbeiten.

    Eine enorme Geschwindigkeitssteigerung erzielt Frau/Divers, wenn am Anfang des Zeichnens nur 1px als Höhe festgelegt wird,
    um danach (mit Prüfziffer und Pipaposchnickschnack) das Graphics-Objekt mittels Höhenstreckung hochgezogen wird.

    Bei Generieren von Lieferscheinen konnte ich um 200x beschleunigen.

    VB.NET-Quellcode

    1. e.Graphics.DrawImage(der1pxBarcode, 0, 0, der1pxBarcode.Width, ZielHoeheinPx)


    Kein gewähr, weil aus dem Kopf und der rechten Maustastenhüfte... :)

    Also eine Kopie, die dann mit neuerer Höhe gezeichnet wird.

    c.u. Joshi im Forensikmodus (Ähh! Ein Meter, ein Bit hier und zwei Hex-Werte dort. Aha! Drei Byte? Wiesoooo....) ?( :huh: ;) :P

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