Bild auf PictureBox schrumpfen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Bild auf PictureBox schrumpfen

    Hi,

    ich lasse mir hier ein Bild in einer PictureBox anzeigen, aber die Originaldimensionen sind deutlich größer als die Picturebox. Kann ich das Bild an die PictureBox anpassen, wenn möglich ohne Verzerrung, also mit Rand, falls die Übersetzung nicht stimmen sollte?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim Foto As String = "abc"
    2. Dim imgdir As New DirectoryInfo(Application.StartupPath & "\bilder")
    3. If imgdir.Exists Then
    4. Dim strfile As String
    5. strfile = imgdir.FullName & "\" & Foto & ".jpg"
    6. Try
    7. Dim bm As New Bitmap(strfile)
    8. PictureBox1.Image = bm
    9. Catch ex As Exception
    10. strfile = imgdir.FullName & "\Error.jpg"
    11. Dim bm As New Bitmap(strfile)
    12. PictureBox1.Image = bm
    13. MsgBox("Gestellfoto existiert nicht in Datenbank!", MsgBoxStyle.Exclamation)
    14. End Try
    15. Else
    16. MsgBox("Verzeichnis nicht gefunden!", MsgBoxStyle.Exclamation)
    17. Me.Close()
    18. Exit Sub
    19. End If
    20. End If


    Viele Grüße

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    PictureBox SizeMode auf Zoom stellen
    Kannst Du auch im Designer über den SmartTag:


    ##########

    MsgBox ist VB6
    und: Fange nur Exceptions ab, die Du kennst und sinnvoll bearbeiten kannst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das ist richtig. Es schmiert ab. Es geht nur darum: Du solltest 1. schauen, ob Du den Try-Catch-Block ggf. durch eine einfache Prüfung mittels If vermeiden kannst und 2. dass Du gezielt nach einem bestimmten Exceptiontyp Ausschau hältst. Catch ex As Exception fängt alles ab. Und wenn ne Meldung kommt, weißt Du gar nicht genau, was die Ursache ist und wie Du die ggf. besser und gezielter beheben kannst. So bekommst Du nur die Meldung, dass irgendwas schiefgegangen ist. Ob das jetzt daran liegt, dass es das Bild nicht in der DB gibt, dass es das falsche Dateiformat hat, dass die Bilddatei defekt ist, dass keine Verbindung zur DB möglich ist, … All das bleibt mit der Post#1-Variante verborgen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    was passiert da ohne Try, wenn ein Fehler auftritt?
    Probiere es aus.
    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!
    @Haudruferzappeltnoch Wenn du beliebig viel Platz auf deiner Form hast, kannst du die PictureBox-Breite und -höhe auch anpassen. Das Bild ist ja sonst gequetscht. Sieht doch doof aus. Hier mein Code. Beachte, dass ich die System.Drawing.Bitmaps in einer Private Property Images_Liste As List(Of System.Drawing.Bitmap) platziert habe. Daher braucht es auch Private Property Index As Integer und die Größe (also B & H) des aktuellen Bildes sowie die größtmögliche erlaubte Größe ( B & H) der PictureBox.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Breite der PictureBox (NICHT der Form!)
    3. ''' </summary>
    4. ''' <returns></returns>
    5. Private ReadOnly Property Moegliche_Breite As Integer = 1767
    6. ''' <summary>
    7. ''' Höhe der PictureBox (NICHT der Form!)
    8. ''' </summary>
    9. ''' <returns></returns>
    10. Private ReadOnly Property Moegliche_Hoehe As Integer = 1001
    11. ''' <summary>
    12. ''' Breite des aktuellen Bildes.
    13. ''' </summary>
    14. ''' <returns></returns>
    15. Private Property Aktuelle_Breite As Integer
    16. ''' <summary>
    17. ''' Höhe des aktuellen Bildes.
    18. ''' </summary>
    19. ''' <returns></returns>
    20. Private Property Aktuelle_Hoehe As Integer
    21. ''' <summary>
    22. ''' Laufindex („Wo sind wir gerade in der Bilder-Liste?“)
    23. ''' </summary>
    24. ''' <returns></returns>
    25. Private Property Index As Integer
    26. ''' <summary>
    27. ''' Sammlung der Bilder, welche in diesem Formular angezeigt werden können.
    28. ''' </summary>
    29. ''' <returns></returns>
    30. Private Property Images_Liste As List(Of System.Drawing.Bitmap)


    VB.NET-Quellcode

    1. Private Sub Button_vorheriges_Bild_Click(sender As Object, e As EventArgs) Handles Button_vorheriges_Bild.Click
    2. If Index > 0 Then
    3. Index -= 1
    4. Anderes_Bild_anzeigen()
    5. End If
    6. End Sub
    7. Private Sub Button_naechstes_Bild_Click(sender As Object, e As EventArgs) Handles Button_naechstes_Bild.Click
    8. If Index < (Me.Images_Liste.Count - 1) Then
    9. Index += 1
    10. Anderes_Bild_anzeigen()
    11. End If
    12. End Sub
    13. Private Sub Anderes_Bild_anzeigen()
    14. If Index < 0 Then Return
    15. Aktuelle_Breite = Me.Images_Liste(Index).Size.Width
    16. Aktuelle_Hoehe = Me.Images_Liste(Index).Size.Height
    17. 'Es gibt jetzt 2 Möglichkeiten:
    18. '1) Bild ist sowohl in der Breite als auch in der Höhe kleiner als der Bildschirm (welcher zum Beispiel 1920×1080 ist) → PictureBox auf Normal-Modus (siehe Else).
    19. '2) Bild ist a) in der Breite, b) in der Höhe oder c) auf beiden Seiten
    20. ' größer, passt also nicht original auf den Bildschirm →
    21. ' PictureBox-Modus auf Stretch-Image, aber leicht zurechtstutzen, um das Seitenverhältnis des Fotos zu bewahren! (siehe If).
    22. ' Beispiel 1: Ich habe einen 1920×1080-Pixel-Monitor, also 16:9 im Seitenverhältnis. Ein 2700×1800-Pixel-Foto (=quer) erreicht zuerst den Bildschirmrand am unteren Ende (y-Achse). Die PictureBox darf also nur so hoch sein wie die mögliche Höhe und sie muss in der Breite relativ zur möglichen Höhe angepasst werden.
    23. ' Beispiel 2: Auf demselben Monitor soll nun ein 1800×2700-Pixel-Foto (=hochkant) dargestellt werden. Dieses Foto erreicht AUCH den unteren Bildschirmrand (y-Achse) zuerst. Die PictureBox darf also nur so hoch sein wie die mögliche Höhe und sie muss in der Breite relativ zur möglichen Höhe angepasst werden.
    24. If Aktuelle_Breite > Moegliche_Breite OrElse Aktuelle_Hoehe > Moegliche_Hoehe Then
    25. PictureBox1.Image = Me.Images_Liste(Index)
    26. PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
    27. ' / Slash bewirkt automatisch ‚Double‘.
    28. PictureBox1.Size = If(CInt(Math.Round(Aktuelle_Breite * Moegliche_Hoehe / Aktuelle_Hoehe, 0)) > Moegliche_Breite,
    29. New Size(Moegliche_Breite, CInt(Math.Round(Aktuelle_Hoehe * Moegliche_Breite / Aktuelle_Breite, 0))),
    30. New Size(CInt(Math.Round(Aktuelle_Breite * Moegliche_Hoehe / Aktuelle_Hoehe, 0)), Moegliche_Hoehe))
    31. Else
    32. PictureBox1.Image = Me.Images_Liste(Index)
    33. PictureBox1.SizeMode = PictureBoxSizeMode.Normal
    34. PictureBox1.Size = New Size(Aktuelle_Breite, Aktuelle_Hoehe)
    35. End If
    36. End Sub


    Mach dir die Logik dahinter klar. Lies dir die in den Kommentarzeilen beschriebenen Fälle durch.
    Die Liste befüllen kannst du mittels

    VB.NET-Quellcode

    1. Me.Images_Liste.Add(New Bitmap("DeinPfadhier"))
    Danke Bartosz ich werds im Hinterkopf behalten.

    @VaporiZed Deine Punkte werden an anderer Stelle geprüft. Das Ganze ist nur ein Ausschnitt. Das Programm arbeiter mit Dingen, die für es bereitgestellt werden müssen. Und dabei könnte auch was schieflaufen. Wenn Fehler an anderen Stellen gemacht werden, dann darf das das Programm nicht behindern, solange der Fehler nicht so wichtig ist. Das konntet ihr natürlich nicht wissen. Try dient da mehr als, wenns nicht funktioniert: egal