2D-Barcodes (QRCode) erstellen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

2D-Barcodes (QRCode) erstellen

Beitrag von dige »

Bild
http://www.purebasic.com

Komplettes Archiv: http://www.fileuploadx.de/994464

Code: Alles auswählen

; by Dige 10/2011
; http://www.purebasic.fr/english/viewtopic.php?f=12&t=47938
; Create 2D Barcodes (QRCode) based on qrencode-win32
; Requires: qrcodelib.lib, qrcodelib.dll
; http://code.google.com/p/qrencode-win32/downloads/list

Structure QRCode
  Version.l
  Width.l
  pSymbolData.l
EndStructure

Enumeration
  #QR_ECLEVEL_L = 0 ; lowest
  #QR_ECLEVEL_M
  #QR_ECLEVEL_Q
  #QR_ECLEVEL_H     ; highest
EndEnumeration

ImportC "..\Lib\qrcodelib.lib"
  QRcode_encodeString8bit(Text.p-ascii, Version.l, QRecLevel.l) As "_QRcode_encodeString8bit"
  QRcode_free(*Qrcode.QRCode) As "_QRcode_free"
EndImport

Procedure CreateQRCode (content.s, ImgID = #PB_Any, EC_Level = #QR_ECLEVEL_L, Size=4 )
  Protected *Qrcode.QRCode, QRImg
  
  *Qrcode = QRcode_encodeString8bit(content, 0, EC_Level)
  
  With *Qrcode
    If *Qrcode = 0 Or \Width = 0
      ProcedureReturn #Null
    Else
      *mem = \pSymbolData
      w    = \Width
    EndIf
  EndWith
  
  QRImg  = CreateImage(ImgID, w, w)
  
  If QRImg
    If ImgID = #PB_Any
      ImgID = QRImg
    EndIf
  EndIf
  
  If StartDrawing(ImageOutput(ImgID))
      ; White Background
      Box (0, 0, ImageWidth(ImgID), ImageHeight(ImgID), #White)  
      
      ; Draw Black Dots
      For y = 0 To w - 1
        For x = 0 To w - 1
          b = PeekB(*mem) & $FF
          If b & 1
            Plot( x, y, #Black)
          EndIf
          *mem + 1
        Next
      Next
      
    StopDrawing()
    
    w * Size
    ResizeImage( ImgID, w, w, #PB_Image_Raw)
  EndIf
  
  QRcode_free(*Qrcode)
  
  ProcedureReturn ImgID
EndProcedure

; Example, how to use it:
CreateImage(0, 200, 200)

OpenWindow(#Null, 0, 0, 450, 400, "2D Barcode Creator", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered )
TextGadget(#PB_Any, 10, 4, 50, 16, "Text" )
StringGadget(0, 10, 20, 200, 20, "Feel the Pure Power!" )

TextGadget(#PB_Any, 10, 44, 50, 16, "EC_Level" )
TrackBarGadget(1, 10, 60, 100, 20, #QR_ECLEVEL_L, #QR_ECLEVEL_H, #PB_TrackBar_Ticks)

TextGadget(#PB_Any, 110, 44, 50, 16, "Size" )
TrackBarGadget(2, 110, 60, 100, 20, 1, 10, #PB_TrackBar_Ticks)

ImageGadget (3, 10, 90, 430, 550, ImageID(0), #PB_Image_Border)

Repeat
  
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 0, 1, 2
        ImgID = CreateQRCode(GetGadgetText(0), #Null, GetGadgetState(1), GetGadgetState(2))
        If IsImage(ImgID)
          SetGadgetState(3, ImageID(ImgID))
        EndIf
    EndSelect
  EndIf

Until Event = #PB_Event_CloseWindow
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von ts-soft »

:allright: Sehr schön

Hab mal versucht das ganze mit der statischen Lib, die keine DLL benötigt, umzusetzen,
aber irgendwie fehlen ihm da immer Symbole. Aber mit der DLL funktioniert es erstmal sehr gut.

Das auslesen eines vorhandenen QRCodes-(Bildes) wäre noch interessant, dann könnten ein paar Leute
mehr meine Signatur entziffern (die entstand bereits vor diesem Thread :wink: )

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von ts-soft »

Da ist noch ein kleiner Bug, Umlaute usw. funktionieren nicht! Berichtigung:

Code: Alles auswählen

ImportC "..\Lib\qrcodelib.lib"
  QRcode_encodeString8bit(Text.p-utf8, Version.l, QRecLevel.l) As "_QRcode_encodeString8bit"
  QRcode_free(*Qrcode.QRCode) As "_QRcode_free"
EndImport
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von rolaf »

Hmmmmm... /:->

Bild
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Marco
Beiträge: 11
Registriert: 25.10.2004 13:53
Wohnort: Bergisch Gladbach

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von Marco »

Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von dige »

Einfach den QR Code mit hohem EC Level erstellen, dann sind mehrfach
Redundanzen enthalten und der Code ist auch noch lesbar wenn Teile
davon verdeckt sind.

Vor allem der mittlere Bereich eignet sich sehr gut dafür...
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Benutzeravatar
dige
Beiträge: 1183
Registriert: 08.09.2004 08:53

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von dige »

rolaf hat geschrieben:Hmmmmm... /:->

Bild
qrcodelib.dll vorhanden?
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."
Marco
Beiträge: 11
Registriert: 25.10.2004 13:53
Wohnort: Bergisch Gladbach

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von Marco »

Hätte ich nicht gedacht :D HAT GEKLAPPT :)
Danke :bounce:
cosphi
Beiträge: 2
Registriert: 11.02.2013 11:44

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von cosphi »

Hallo,
ich hoffe mal dass dieser Beitrag trotz des Alters noch gelesen wird :-)
wo bekomme ich denn die Dateien: qrcodelib.lib und qrcodelib.dll her?

Unter http://code.google.com/p/qrencode-win32 habe ich leider nur ein Beispielprogramm aber keine Bibliotheken gefunden.

Vielen Dank
Benutzeravatar
Falko
Admin
Beiträge: 3531
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0
Kontaktdaten:

Re: 2D-Barcodes (QRCode) erstellen

Beitrag von Falko »

Wenn du dort auf Download gehst und danach oben in der Eingabe für search "All Downloads" und danach search wählst,
kriegst du alles, was du brauchst.

Ich habe hier den Direktlink der direkt zur Zip führt.
http://code.google.com/p/qrencode-win32 ... p&can=1&q=

Ich selbst habe den Source von dige mit der Unicodeänderung von ts-soft für mich speziell etwas umgeschrieben.
Somit soll man max. eine halbe DIN A4 QR-Code erzeugen können und diese kann man nun auch speichern. Leider
funktioniert aus irgendeinen Grund das Unicode nicht. Vielleicht weiß hier einer Rat, falls ich was falsch gemacht haben
sollte /:->

Code: Alles auswählen

; by Dige 10/2011
; http://www.purebasic.fr/english/viewtopic.php?f=12&t=47938
; Create 2D Barcodes (QRCode) based on qrencode-win32
; Requires: qrcodelib.lib, qrcodelib.dll
; http://code.google.com/p/qrencode-win32/downloads/list
; Following added from Falko  11.02.2013
; DLL und lib  direkt hier:
; http://code.google.com/p/qrencode-win32/downloads/detail?name=qrcode-win32-3.1.1.zip&can=1&q=
; Save hinzugefügt alsauch nun zu EditorGadget geändert
; Compilerüberprüfung auf Unicde hinzugefügt sowie zu Text.p-utf8 im Import geändert

CompilerIf #PB_Compiler_Unicode = 0
    CompilerError "compile with UNICODE!"
CompilerEndIf

EnableExplicit

Define File.s
Define event.i
Define ImgID.i

Structure QRCode
  Version.l
  Width.l
  pSymbolData.l
EndStructure

Enumeration
  #QR_ECLEVEL_L = 0 ; lowest
  #QR_ECLEVEL_M
  #QR_ECLEVEL_Q
  #QR_ECLEVEL_H     ; highest
EndEnumeration


UseJPEGImageEncoder()


ImportC "qrcodelib.lib"
  QRcode_encodeString8bit(Text.p-utf8, Version.l, QRecLevel.i) As "_QRcode_encodeString8bit"
  QRcode_free(*Qrcode.QRCode) As "_QRcode_free"
EndImport

Procedure CreateQRCode (content.s, ImgID = #PB_Any, EC_Level = #QR_ECLEVEL_L, Size=4 )
  Protected *Qrcode.QRCode, QRImg, *mem, w, y, x, b
 
  *Qrcode = QRcode_encodeString8bit(content, 0, EC_Level)
 
  With *Qrcode
    If *Qrcode = 0 Or \Width = 0
      ProcedureReturn #Null
    Else
      *mem = \pSymbolData
      w    = \Width
    EndIf
  EndWith
 
  QRImg  = CreateImage(ImgID, w, w)
 
  If QRImg
    If ImgID = #PB_Any
      ImgID = QRImg
    EndIf
  EndIf
 
  If StartDrawing(ImageOutput(ImgID))
      ; White Background
      Box (0, 0, ImageWidth(ImgID), ImageHeight(ImgID), #White) 
     
      ; Draw Black Dots
      For y = 0 To w - 1
        For x = 0 To w - 1
          b = PeekB(*mem) & $FF
          If b & 1
            Plot( x, y, #Black)
          EndIf
          *mem + 1
        Next
      Next
     
    StopDrawing()
   
    w * Size
    ResizeImage( ImgID, w, w, #PB_Image_Raw)
  EndIf
 
  QRcode_free(*Qrcode)
 
  ProcedureReturn ImgID
EndProcedure

; Example, how to use it:
CreateImage(0, 200, 200)

OpenWindow(#Null, 0, 0, 850, 500, "2D Barcode Creator", #WS_OVERLAPPEDWINDOW|#PB_Window_ScreenCentered )
;TextGadget(#PB_Any, 10, 4, 50, 16, "Text" )
EditorGadget(0, 400, 50, 400, 350)

TextGadget(#PB_Any, 10, 44, 50, 16, "EC_Level" )
TrackBarGadget(1, 10, 60, 100, 20, #QR_ECLEVEL_L, #QR_ECLEVEL_H, #PB_TrackBar_Ticks)

TextGadget(#PB_Any, 110, 44, 50, 16, "Size" )
TrackBarGadget(2, 110, 60, 100, 20, 1, 10, #PB_TrackBar_Ticks)

ImageGadget (3, 10, 90, 430, 550, ImageID(0), #PB_Image_Border)

ButtonGadget(4,5,5,50,20,"Save")
AddGadgetItem(0, 0, "QR-Code hier einfügen")

Repeat
 
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 0, 1, 2
        ImgID = CreateQRCode(GetGadgetText(0), #Null, GetGadgetState(1), GetGadgetState(2))
        If IsImage(ImgID)
          SetGadgetState(3, ImageID(ImgID))
        EndIf
      Case 4
        File=SaveFileRequester("QR-Code als JPG speichern","QR-Image","jpg (*.jpg)",1)
        SaveImage(0,File+".jpg")
    EndSelect
  EndIf

Until Event = #PB_Event_CloseWindow
Gruß,
Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Antworten