Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - QR Code
Forum - C# / VB.NET - QR Code

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 13:06
Martedì, 29/06/2021
Buongiorno, aiutandomi con quanto trovato sul web sono riuscito a fare due programmini
in VB 2019 per ottenere il codice QR di un breve testo ed anche il procedimento inverso
con la decodifica del QR ottenendone il testo di partenza (allegato).
Non riesco però, e non so se è possibile, a fare analogo programma per ottenere
il codice QR di un file immagine in PictureBox. Qualcuno può aiutarmi?
Grazie e saluti.

Codice sorgente - presumibilmente VB.NET

  1. ' *** QR Code da testo in TextBox ***
  2. Public Class Form1
  3.     ' Programma OK (per la sola trasfprmazione di un breve testo in QR Code.
  4.     Dim QR_Generator As New MessagingToolkit.QRCode.Codec.QRCodeEncoder
  5.     Dim n As Integer
  6.  
  7.   Private Sub Textbox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
  8.         Try
  9.             PictureBox1.Image = QR_Generator.Encode(TextBox1.Text)
  10.         Catch ex As Exception
  11.             MsgBox(ex.Message)
  12.         End Try
  13.     End Sub
  14.    
  15.  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  16.         SaveFileDialog1.ShowDialog()
  17.     End Sub
  18.  
  19.     Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
  20.         Try
  21.             Dim img As New Bitmap(PictureBox1.Image)
  22.             img.Save(SaveFileDialog1.FileName, Imaging.ImageFormat.Png)
  23.         Catch ex As Exception
  24.             MsgBox(ex.Message)
  25.         End Try
  26.     End Sub
  27.  
  28.     Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
  29.         n = n + 1
  30.  
  31.         Label1.Text = "Restano ancora " & 123 - n & " caratteri"
  32.         If n = 120 Then TextBox1.TabIndex = 5 : Exit Sub
  33.     End Sub
  34. End Class
  35. '-----------------
  36. ' *** Decodifica da QR Code ***
  37. Public Class Form1
  38.     Dim decript As New MessagingToolkit.QRCode.Codec.QRCodeDecoder
  39.  
  40.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnScelta.Click
  41.         If OpenFileDialog1.ShowDialog = DialogResult.OK Then
  42.             TextBox2.Text = OpenFileDialog1.FileName
  43.             PictureBox1.Image = Image.FromFile(TextBox2.Text)
  44.         End If
  45.     End Sub
  46.  
  47.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  48.         TextBox1.Text = decript.decode(New MessagingToolkit.QRCode.Codec.Data.QRCodeBitmapImage(PictureBox1.Image))
  49.     End Sub
  50.  
  51. End Class


Ultima modifica effettuata da Thejuster il 29/06/2021 alle 17:32
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:31
Martedì, 29/06/2021
Che problema da? errori? dove è che non funziona.


PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 18:52
Martedì, 29/06/2021
Salve, grazie per la risposta. I due programmini che ho allegato funzionano benisssimo.
Infatti dopo aver scaricato e inserito nei Riferimenti la libreria "MessagingToolkit.QRCode..."
riesco a ottenere quello che volevo e cioè ottenere QRCode da un breve testo e viceversa
ottenere il testo dopo aver caricato l'immagine del QRCode.
La mia domanda è:
è possibile ottenere il QRCode anche da una foto?
Sul web non ho trovato indicazioni in proposito.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 20:46
Martedì, 29/06/2021
E' possibile certo, esistono applicazioni fatte apposta.
Però sinceramente come facciano a calcolare gli spazi ed interpretare il codice non ho la più pallida idea.
Mai provato a crearne uno.

Però, esiste ZXing.Net lo puoi importare trai i pacchetti Nuget.

Anziché utilizzare un immagine, usi la webcam.
Credo che non sia possibile farlo tramite immagine.
anche perché il processo viene ottimizzato dalla GPU e non dalla CPU di cui effettua numerosi calcoli in molto poco
tempo rispetto alla CPU, quindi viene utilizzato credo via DirectVideo o DirectShow.


Edit:
Ho trovato appunto un video
https://www.youtube.com/watch?v=0_u-9nykBrg

Ultima modifica effettuata da Thejuster il 29/06/2021 alle 20:49


PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 6:09
Mercoledì, 30/06/2021
Buongiorno, ti ringrazio della spiegazione ma avevo già trovato un video, e in vb.net, analogo a quello che mi hai segnalato.
Scusa ma non mi sono espresso bene. Io non voglio acquisire da webcam il QR code e trasformarlo, decodificandolo, nel testo corrispondente.
Io vorrei fare un altro programma con due picturebox e un button. Carico nella picturebox1 una immagine qualunque, ad es. un semplice disegno/logo in jpg, e poi tramite una o più istruzioni analoghe a quelle che ho utilizzato nei due esempi che avevo allegato, trasformare questo file jpg nella immagine del corrispondente QRCode in PNG da mostrare poi nella picturebox2.
Saluti.

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2094
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:40
Mercoledì, 30/06/2021
Ahh ecco ora si.

In questo caso, Mi viene in mente un unica soluzione.
Ma non so se può funzionare, o è la soluzione migliore.
Ma l'unico modo per ottenere dei dati RAW di un immagine e quella di estrapolare i suoi relativi bytes

Devi sapere che qualsiasi cosa: Oggetto, classe, immagine, struttura, lista etc.
può essere convertita in bytes per poter essere trasportata ovunque e ricostruita.

Gli installer ad esempio funzionano in questo modo, Leggono tutti i bytes dell'intero file,
E li aggiungono in una lista per poi serializzare tutto.
In modo che in seguito basta riconvertire quei bytes per ottenere esattamente la struttura di un file.
così vale per l'immagine.

un esempio è

Codice sorgente - presumibilmente VB.NET

  1. Public Function imgToByteArray(ByVal img As Image) As Byte()
  2.         Using mStream As New MemoryStream()
  3.             img.Save(mStream, img.RawFormat)
  4.             Return mStream.ToArray()
  5.         End Using
  6.     End Function



Passando un immagine come parametro a questa funzione, si usa il MemoryStream che è differente dallo StreamWrite o StreamReader che agiscono unicamente su file, mentre il Momery appunto agisce sulla memoria ram locale.

quindi basta semplicemente fare

Codice sorgente - presumibilmente VB.NET

  1. Dim img As Image = Image.FromFile("C:\logo.png")
  2. Dim Arraydibyte As Byte() = imgToByteArray(img)



In questo caso, ora non sò come funziona la libreria e la lunghezza massima che riesce a supportare.
la funzione ritorna una serie di numeri in bytes che formano un array.
In seguito dovrai riconvertire quei numeri in immagine.



Codice sorgente - presumibilmente VB.NET

  1. Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
  2.         Using mStream As New MemoryStream(byteArrayIn)
  3.             Return Image.FromStream(mStream)
  4.         End Using
  5.     End Function




Codice sorgente - presumibilmente Plain Text

  1. 'esempio
  2. PictureBox1.Image = byteArrayToImage(Arraydibyte)



Bisogna fare una prova.


PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 9:27
Mercoledì, 30/06/2021
Salve, son contento di essere riuscito a esprimere quello che intendevo e come avrai intuito anche dalla semplicità dei miei "programmi" sono proprio alle prime armi. Mi studierò le indicazioni e gli esempi che mi hai postato sperando di capirli e di riuscire a metterli insieme in righe di codice funzionante.
Grazie.

PM Quote
Avatar
Sal47 (Normal User)
Pro


Messaggi: 96
Iscritto: 05/02/2009

Segnala al moderatore
Postato alle 12:24
Giovedì, 01/07/2021
Buongiorno
ho fatto molti tentativi di inserire i tuoi blocchi di codice
nel mio breve programma, senza risultato.
Ma lo prevedevo in partenza; per me sono passaggi molto difficili.
Ogni istruzione mi comporta molto impegno e tante prove.
Solo per completezza riporto il codice (NON funzionante) che ho fatto.
Tra l'altro non so proprio come utilizzare le funzioni che hai indicato nè
quali parametri "passare" nel richiamarle e anche come utilizzare in questo
caso il "QR_Code As New MessagingToolkit.QRCode.Codec.QRCodeEncoder"
che forse è necessario usare per ottenere il QR del file png.
Mi dovrò accontentare di aver fatto almeno il QR Code per un breve testo.
Ti ringrazio ancora per l'interessamento.
P.S. In merito alla lunghezza sopportabile dalla libreria (e penso ti riferisca a MessagingToolKit...)
      l'inserimento del testo nel mio primo listato si blocca dopo cira 120 caratteri).
------------------------
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Dim img As Image = Image.FromFile("C:\Users\Proprietario\Desktop\orologio.png")
  3.     ' il piccolo file "orologio" (circa 25 kb) può essere sostituito con qualunque altro file png
  4.     Dim Arraydibyte As Byte() = imgToByteArray(img)
  5.     Dim QR_Code As New MessagingToolkit.QRCode.Codec.QRCodeEncoder
  6.   '  Public Property QR_Generator As Object
  7.  
  8.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSceltaPng.Click
  9.         ' tralascio il fileDialog e carico in pictureBox1 direttamente il png
  10.         ' If OpenFileDialog1.ShowDialog = DialogResult.OK Then
  11.         'TextBox1.Text = OpenFileDialog1.FileName
  12.         'PictureBox1.Image = Image.FromFile(TextBox1.Text)
  13.         ' End If
  14.        
  15.         PictureBox1.Image = Image.FromFile("C:\Users\Proprietario\Desktop\orologio.png")
  16.           ' forse quì richiamare imgToByteArray ??
  17.           Call imgToByteArray(mStream)
  18.      End Sub
  19.    
  20.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnGeneraQR.Click
  21.         Call byteArrayToImage(Image)
  22.         ' PictureBox2.Image = byteArrayToImage(Arraydibyte)
  23.         PictureBox2.Image = QR_Generator.Encode(Arraydibyte)
  24.     End Sub
  25.  
  26.     Public Function imgToByteArray(ByVal img As Image) As Byte()
  27.         Using mStream As New IO.MemoryStream()
  28.             img.Save(mStream, img.RawFormat)
  29.             Return mStream.ToArray()
  30.         End Using
  31.     End Function
  32.    
  33.    Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
  34.         Using mStream As New IO.MemoryStream(byteArrayIn)
  35.             Return Image.FromStream(mStream)
  36.         End Using
  37.     End Function
  38.  
  39. End Class


Ultima modifica effettuata da Thejuster il 01/07/2021 alle 14:58
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6176
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 7:10
Venerdì, 02/07/2021
Un qr code puo' ospitare dai 4k ai 7k caratteri. Non capisco come tu voglia codificare una jpg che in genere e' molto piu' grande.

Ultima modifica effettuata da nessuno il 02/07/2021 alle 9:25


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo