Oppure

Loading
29/06/21 11:06
Sal47
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.


' *** 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 29/06/21 15:32
aaa
29/06/21 15:31
Thejuster
Che problema da? errori? dove è che non funziona.
mire.forumfree.it/ - Mire Engine
C# UI Designer
29/06/21 16:52
Sal47
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.
aaa
29/06/21 18:46
Thejuster
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
youtube.com/…
Ultima modifica effettuata da Thejuster 29/06/21 18:49
mire.forumfree.it/ - Mire Engine
C# UI Designer
30/06/21 4:09
Sal47
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.
aaa
30/06/21 6:40
Thejuster
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 è

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


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.




Public Function byteArrayToImage(ByVal byteArrayIn As Byte()) As Image
        Using mStream As New MemoryStream(byteArrayIn)
            Return Image.FromStream(mStream)
        End Using
    End Function




'esempio 
PictureBox1.Image = byteArrayToImage(Arraydibyte)



Bisogna fare una prova.
mire.forumfree.it/ - Mire Engine
C# UI Designer
30/06/21 7:27
Sal47
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.
aaa
01/07/21 10:24
Sal47
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).
------------------------

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 01/07/21 12:58
aaa