Bild in Picturebox skaliert laden/zeichnen und in Bitmap zeichnen

  • VB.NET

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

    Bild in Picturebox skaliert laden/zeichnen und in Bitmap zeichnen

    Hi,

    ich möchte ein Bild in eine PictureBox skaliert laden/zeichnen und dieses Bild aus der PictureBox wiederum in einer Methode in ein Bitmap laden, verarbeiten und wieder in die PictureBox laden.
    Nur weiß ich nicht, wie ich das machen soll. Wenn ich direkt auf die Steuerfläche der PictureBox zeichne, benutze ich schließlich nicht die Imageeigenschaft und diese verweist auf nichts. Aber um das BIld weiterzuverwenden, muss ich doch irgendwie das skalierte Bild in PictureBox.Image laden.
    Ich finde leider den Link nicht mehr. sobald ich ihn habe poste ich ihn dir:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Mit diesem Code lässt sich ein Bild ohne Qualitätsverlust neu skalieren,
    2. 'wobei das Größenverhältnis beibehalten wird. Dies ist immer dann interessant,
    3. 'wenn man Bilder in einer PictureBox anzeigen möchte
    4. 'und die Bilder größer oder kleiner als die PictureBox selbst sind.
    5. 'Man kann die Funktion aber auch dazu nutzen,
    6. 'um Thumbnails (Miniaturansichten) von Bilder in einer einheitlichen Größe zu erstellen.
    7. 'Die Funktion erwartet im ersten Parameter das Bild-Objekt.
    8. 'Die beiden nachfolgenden Parameter legen die maximale Breite und Höhe des Bildes fest.
    9. 'Ist das Bild breiter als die maximal angegebene Breite, wird die Breite des Bildes angepasst,
    10. 'wobei die Höhe neu berechnet wird und umgekehrt,
    11. 'so dass das Größenverhältnis des Originalbildes immer gleich bleibt.
    12. 'Weiterhin wird das Bild bei Anpassung der Breite und/oder Höhe interpoliert,
    13. 'damit die Qualität erhalten bleibt.
    14. 'Ist das Originalbild sowohl in der Breite als auch in der Höhe kleiner als die angegebenene maximale Dimension,
    15. 'lässt sich über den optionalen Parameter "bStretch" festlegen,
    16. 'ob das Bild gestretcht werden oder in der Originalgröße dargestellt werden soll.
    17. Public Class Form1
    18. Public Function AutoSizeImage(ByVal oBitmap As Image, _
    19. ByVal maxWidth As Integer, _
    20. ByVal maxHeight As Integer, _
    21. Optional ByVal bStretch As Boolean = False) As Image
    22. ' Größenverhältnis der max. Dimension
    23. Dim maxRatio As Single = CSng(maxWidth / maxHeight)
    24. ' Bildgröße und aktuelles Größenverhältnis
    25. Dim imgWidth As Integer = oBitmap.Width
    26. Dim imgHeight As Integer = oBitmap.Height
    27. Dim imgRatio As Single = CSng(imgWidth / imgHeight)
    28. ' Bild anpassen?
    29. If (imgWidth > maxWidth Or imgHeight > maxHeight) Or (bStretch) Then
    30. If imgRatio <= maxRatio Then
    31. ' Größenverhältnis des Bildes ist kleiner als die
    32. ' maximale Größe, in der das Bild angezeigt werden kann.
    33. ' In diesem Fall muss die Bildbreite angepasst werden.
    34. imgWidth = CInt(imgWidth / (imgHeight / maxHeight))
    35. imgHeight = maxHeight
    36. Else
    37. ' Größenverhältnis des Bildes ist größer als die
    38. ' maximale Größe, in der das Bild angezeigt werden kann.
    39. ' In diesem Fall muss die Bildhöhe angepasst werden.
    40. imgHeight = CInt(imgHeight / (imgWidth / maxWidth))
    41. imgWidth = maxWidth
    42. End If
    43. ' Bitmap-Objekt in der neuen Größe erstellen
    44. Dim oImage As New Bitmap(imgWidth, imgHeight)
    45. ' Bild interpolieren, damit die Qualität erhalten bleibt
    46. Using g As Graphics = Graphics.FromImage(oImage)
    47. g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    48. g.DrawImage(oBitmap, New Rectangle(0, 0, imgWidth, imgHeight))
    49. End Using
    50. ' neues Bitmap zurückgeben
    51. Return oImage
    52. Else
    53. ' unverändertes Originalbild zurückgeben
    54. Return oBitmap
    55. End If
    56. End Function
    57. 'Aufrufbeispiel
    58. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    59. ' Bild laden
    60. Dim oStream As New System.IO.FileStream("C:\Users\Bernd\Pictures\abpup.gif", IO.FileMode.Open)
    61. Dim oBitmap As Bitmap
    62. oBitmap = New Bitmap(oStream)
    63. oStream.Close()
    64. ' Bild soll optimal an die Größe der PictureBox angepasst und angezeigt werden
    65. With PictureBox1
    66. .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height)
    67. End With
    68. End Sub
    69. ' Mit einer TrackBar vergrößern o. verkleinern
    70. Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
    71. PictureBox1.Width = TrackBar1.Value
    72. PictureBox1.Height = TrackBar1.Value
    73. ' Bild soll optimal an die Größe der PictureBox angepasst und angezeigt werden
    74. With PictureBox1
    75. .Image = AutoSizeImage(oBitmap, .ClientRectangle.Width, .ClientRectangle.Height, True)
    76. End With
    77. Label1.Text = TrackBar1.Value.ToString
    78. Me.Refresh()
    79. 'PictureBox1.Refresh()
    80. End Sub
    81. End Class


    Edit: Der link
    Wenn Du so etwas wie Bildverarbeitung machen willst, sollte das Ausgabemedium stets sekundär sein.
    Halte Deine Bildinformationen / Bilder in Arrays / Bitmaps und stelle diese nach jedem Bearbeitungsschritt in einer PictureBox dar, das kannst Du im PictureBox_Paint()-Ereignis machen.
    Die Image-Eigenschaft der PictureBox benötigst Du dann nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!