
Sal47 (Normal User)
Pro
    
Messaggi: 96
Iscritto: 05/02/2009
|
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 |
' *** QR Code da testo in TextBox *** Public Class Form1 ' Programma OK (per la sola trasfprmazione di un breve testo in QR Code. Dim QR_Generator As New MessagingToolkit.QRCode.Codec.QRCodeEncoder Dim n As Integer Private Sub Textbox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged Try PictureBox1.Image = QR_Generator.Encode(TextBox1.Text) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click SaveFileDialog1.ShowDialog() End Sub Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk Try Dim img As New Bitmap(PictureBox1.Image) img.Save(SaveFileDialog1.FileName, Imaging.ImageFormat.Png) Catch ex As Exception MsgBox(ex.Message) End Try End Sub Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress n = n + 1 Label1.Text = "Restano ancora " & 123 - n & " caratteri" If n = 120 Then TextBox1.TabIndex = 5 : Exit Sub End Sub End Class '----------------- ' *** Decodifica da QR Code *** Public Class Form1 Dim decript As New MessagingToolkit.QRCode.Codec.QRCodeDecoder Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnScelta.Click If OpenFileDialog1.ShowDialog = DialogResult.OK Then TextBox2.Text = OpenFileDialog1.FileName PictureBox1.Image = Image.FromFile(TextBox2.Text) End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click TextBox1.Text = decript.decode(New MessagingToolkit.QRCode.Codec.Data.QRCodeBitmapImage(PictureBox1.Image)) End Sub End Class
|
Ultima modifica effettuata da Thejuster il 29/06/2021 alle 17:32 |
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2274
Iscritto: 04/05/2008
|
Che problema da? errori? dove è che non funziona.
|
|

Sal47 (Normal User)
Pro
    
Messaggi: 96
Iscritto: 05/02/2009
|
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.
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2274
Iscritto: 04/05/2008
|
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
|
|

Sal47 (Normal User)
Pro
    
Messaggi: 96
Iscritto: 05/02/2009
|
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.
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2274
Iscritto: 04/05/2008
|
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 |
Public Function imgToByteArray(ByVal img As Image) As Byte() Using mStream As New MemoryStream() img.Save(mStream, img.RawFormat) Return mStream.ToArray() End Using 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 |
Dim img As Image = Image.FromFile("C:\logo.png") 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 |
Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image Using mStream As New MemoryStream(byteArrayIn) Return Image.FromStream(mStream) End Using End Function
|
Codice sorgente - presumibilmente Plain Text |
'esempio
PictureBox1.Image = byteArrayToImage(Arraydibyte)
|
Bisogna fare una prova.
|
|

Sal47 (Normal User)
Pro
    
Messaggi: 96
Iscritto: 05/02/2009
|
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.
|
|

Sal47 (Normal User)
Pro
    
Messaggi: 96
Iscritto: 05/02/2009
|
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 |
Public Class Form1 Dim img As Image = Image.FromFile("C:\Users\Proprietario\Desktop\orologio.png") ' il piccolo file "orologio" (circa 25 kb) può essere sostituito con qualunque altro file png Dim Arraydibyte As Byte() = imgToByteArray(img) Dim QR_Code As New MessagingToolkit.QRCode.Codec.QRCodeEncoder ' Public Property QR_Generator As Object Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnSceltaPng.Click ' tralascio il fileDialog e carico in pictureBox1 direttamente il png ' If OpenFileDialog1.ShowDialog = DialogResult.OK Then 'TextBox1.Text = OpenFileDialog1.FileName 'PictureBox1.Image = Image.FromFile(TextBox1.Text) ' End If PictureBox1.Image = Image.FromFile("C:\Users\Proprietario\Desktop\orologio.png") ' forse quì richiamare imgToByteArray ?? Call imgToByteArray(mStream) End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btnGeneraQR.Click Call byteArrayToImage(Image) ' PictureBox2.Image = byteArrayToImage(Arraydibyte) PictureBox2.Image = QR_Generator.Encode(Arraydibyte) End Sub Public Function imgToByteArray(ByVal img As Image) As Byte() Using mStream As New IO.MemoryStream() img.Save(mStream, img.RawFormat) Return mStream.ToArray() End Using End Function Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image Using mStream As New IO.MemoryStream(byteArrayIn) Return Image.FromStream(mStream) End Using End Function End Class
|
Ultima modifica effettuata da Thejuster il 01/07/2021 alle 14:58 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6346
Iscritto: 03/01/2010
|
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à. |
|