Visual Basic .NET - PictureBox und Bitmap

  • VB.NET
  • .NET (FX) 4.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Walchhofer.

    Visual Basic .NET - PictureBox und Bitmap

    Guten Abend,

    ich habe ein Problem - ich will mit Hilfe von der google.Chart Funktion einen QR-Code erstellen,
    dies funktioniert grundsätzlich. Aber ich brauche es für den Ausdruck als Bitmap,
    und da klemmt es.

    Ich habe eine Testform, mit zwei Pictureboxen, und einen Butten, der ruft die Funktion QR_Fuellen auf.
    1. Ich fülle eine PictureBox mit dem QR-Code über die Google Chart Funktion (funktioniert)
    2. Schreibe aus dieser PictureBox in eine Bitmap
    3. Schreibe diese Bitmap in das Bild 2

    Eigentlich brauche ich die Bitmap, Schritt 3 ist ein Test, ob die BMP passt bzw. Daten drin hat.
    Funktioniert irgendwie, und doch wieder nicht. Und zwar habe ich beim ersten Aufruf in Bild1 den Link1, und in Bild2 das Zeichen Ungültiges Bild.
    Wenn ich die Funktion das nächste Mal aufrufe, habe ich in Bild 1 den Link2, und auf einmal mit einem Klick Verspätung in Bild2 jetzt erst den Link1.

    Irgendwie gibt die PictureBox1 bei DrawToBitmap noch den alten Inhalt aus, obwohl das neue Bild schon geladen wurde.
    Ich habe es bereits zwischendurch mit PictureBox1.Refresh() probiert, aber es klappt nicht. Auch ein zweimaliger Funktionsaufruf im Button funktioniert nicht.

    Habt Ihr irgendeine Idee ? Wäre Euch dankbar, LG Michi

    P.S. : Eine Funktion, die direkt den Webseiteninhalt ohne Umweg über die PictureBox in das Bitmap füllt, würde das Problem auch lösen. Also irgendwie sowas wie myBitmap = InhaltVon("http:/....")

    VB.NET-Quellcode

    1. Public Sub QR_Fuellen(Inhalt As String)
    2. ' Zuerst die 1. Picture Box füllen
    3. PictureBoxQR1.ImageLocation = "http://chart.apis.google.com/chart?cht=qr&chs=200x200&chl=" + Inhalt + "&chld=H|0"
    4. ' Jetzt eine Bitmap erstellen, und mit dem Bild füllen
    5. Dim myRectangle As Rectangle
    6. Dim myBitmap As New Bitmap(200, 200)
    7. myRectangle.X = 0
    8. myRectangle.Y = 0
    9. myRectangle.Width = 200
    10. myRectangle.Height = 200
    11. PictureBoxQR1.DrawToBitmap(myBitmap, myRectangle)
    12. ' Und das 2. Bild mit der Bitmap füllen
    13. PictureBoxQR2.Image = myBitmap
    14. End Sub

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

    Ich hätte zuerst das Bild heruntergeladen und es erst danach anzeigen. Beispiel:

    VB.NET-Quellcode

    1. Private Sub ActionButton_Click(sender As Object, e As EventArgs) Handles ActionButton.Click
    2. Dim localBarcodeFileName = IO.Path.Combine(IO.Path.GetTempPath, "barcode.png")
    3. Dim value = Me.ValueTextBox.Text
    4. Me.GenerateAndDownloadBarcode(value, localBarcodeFileName)
    5. Me.BarcodePictureBox.ImageLocation = localBarcodeFileName
    6. End Sub
    7. Private Sub GenerateAndDownloadBarcode(value As String, localBarcodePath As String)
    8. Using client As New Net.WebClient
    9. Dim url = String.Concat("http://chart.apis.google.com/chart?cht=qr&chs=200x200&chl=", value, "&chld=H|0")
    10. Dim barcodeData = client.DownloadData(url)
    11. IO.File.WriteAllBytes(localBarcodePath, barcodeData)
    12. End Using
    13. End Sub
    Hallo xtts02,

    herzlichen Dank für Deine Hilfe, das hat geklappt.

    So spare ich mir den Umweg über PictureBoxQR1.DrawToBitmap(myBitmap, myRectangle),
    und kann die Bitmap direkt aus der zwischengelagerten Datei füllen.

    Das einzige Problem, was ich hatte, war dass
    IO.File.WriteAllBytes(localBarcodePath, barcodeData)
    eigentlich die Datei öffnen sollte, beschreiben (bei Bedarf auch überschreiben) und auch schließen sollte.
    Bekam aber hier immer beim 2. Aufruf der Funktion "Zugriff auf Datei nicht möglich, weil Sie von einem anderen Prozess geöffnet ist" Keine Ahnung, welche Funktion hier nicht geschlossen hat.

    Habe dies jetzt so gelöst, dass ich verschiedene Dateinamen kreiere, geht gut,

    LG Michael
    msdn.microsoft.com/de-de/libra…rebox.load(v=vs.110).aspx
    sobald die ausgeführt wurde ist Image auf das Bild gesetzt und kann direkt verwendet werden, aber umweg über UI ist natürlich mist.

    Auch über eine Datei halte ich in den meisten Fällen nicht für Sinnvoll.

    Bitmap kann direkt auf nen Stream arbeiten:
    msdn.microsoft.com/de-de/library/z7ha67kw(v=vs.110).aspx

    Also kann man z.B. die heruntergeladenen Bytes in nen MemoryStream schieben und von dort das Bitmap laden.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---