Image Box verändert Bild beim laden

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Mabbi.

    Image Box verändert Bild beim laden

    Hi,

    ich habe grade ein Problem mit einer VB PictureBox.

    1. Ich lade ein jpg in die Picture box, funktioniert einwandfrei
    2. an anderer Stelle im Programm nutze ich ein bitmap mit drawimageunscaled um das gleiche Bild zu laden, dieses soll dann geändert und wieder gespeichert werden

    Dies ist der Code, in dem Beispiel lade ich das gleiche Bild in 2 unterschiedliche PictureBox 'en, die PictureBox 'en sind technisch identisch (2. ist eine Kopie der 1.):

    VB.NET-Quellcode

    1. Dim Filename As String = "c:\Logo-Desktop.jpg"
    2. Try
    3. Using fs As New System.IO.FileStream(filename, IO.FileMode.Open)
    4. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    5. PictureBox1.Image = New Bitmap(Image.FromStream(fs))
    6. End Using
    7. Catch ex As Exception
    8. Dim msg As String = "Filename: " & filename &
    9. Environment.NewLine & Environment.NewLine &
    10. "Exception: " & ex.ToString
    11. MessageBox.Show(msg, "Error Opening Image File")
    12. End Try
    13. 'an anderer Stelle
    14. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom
    15. Dim bmp = Bitmap.FromFile(Filename)
    16. Dim newImage = New Bitmap(bmp.Width, bmp.Height)
    17. Dim gr = Graphics.FromImage(newImage)
    18. gr.DrawImageUnscaled(bmp, 0, 0)
    19. PictureBox2.Image = newImage


    Das Ergebnis sieht so aus:





    Problem: Das Bild wird skaliert und beschnitten beim Laden in die 2. Picture Box

    Hat jemand hierzu eine Idee, wie man das Bild als Bitmap lädt und es identisch zu dem direkten Laden als Image in die Picturebox ist ?
    Oder anders: Was mache ich falsch ?


    Für Eure Hilfe vorab vielen Dank.

    P.s.: Oder liegt hier einfach ein Problem vor beim konvertieren des jpg-Formats in ein bitmap ?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mabbi“ ()

    @ErfinderDesRades Jou.

    Mabbi schrieb:

    VB.NET-Quellcode

    1. gr.DrawImageUnscaled(bmp, 0, 0)
    Weise der PictureBox das Original-Bild zu und probier mal die Property .SizeMode aus.
    docs.microsoft.com/de-de/dotne…box.sizemode?view=net-5.0
    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!
    Naja, in der 2. PicBox malst Du ja das Bild selber - unskaliert. Da dürfte es wurscht sein, dass die PicBox auf Zoom eingestellt ist.
    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.

    ErfinderDesRades schrieb:

    könnte mir vorstellen, die Pictureboxen haben einfach eine unterschiedliche Scale - einstellung: die linke zoomt, die rechte nicht oder sowas.


    Weise der PictureBox das Original-Bild zu und probier mal die Property .SizeMode aus.


    Beide werden extra vor dem Laden gesetzt, habe Zoom, Stretch etc. ausprobiert:

    VB.NET-Quellcode

    1. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
    2. ...
    3. PictureBox2.SizeMode = PictureBoxSizeMode.Zoom



    @Vaporized: Das Bild wird doch in ein bitmap mit den richtigen Pixel-Werten für Höhe und Breite kopiert.

    VB.NET-Quellcode

    1. Dim newImage = New Bitmap(bmp.Width, bmp.Height)


    Erst danach lade ich es in die PictureBox ?

    Ich sehe einfach den Fehler nicht den ich mache, probiere das jetzt mal mit einem .bmp anstelle eines .jpg Vorlagebildes, vielleicht liegt da ja der Fehler.
    (Nachtrag: kein Unterschied, immer noch das gleiche "beschnittene" Ergebnis)

    Sonst noch jemand Ideen ?


    Nachtrag: Ich habe die Lösung gefunden. Und die ist echt schräg:

    VB.NET-Quellcode

    1. 'gr.DrawImageUnscaled(bmp, 0, 0)
    2. gr.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height)


    Wenn ich die "unscaled" Methode durch feste Werte ersetze, dann sind die Ergebnisse beim direkten Laden und dem Umweg über die Bitmap gleich.

    "Unscaled ist wohl eher "unscaled and clipped at aprox. 75%" ... warum auch immer. Laut der Diskussion in dem Link unten hat es etwas mit den dot per Inch Werten zu tun.

    Gefunden eher zufällig im Netz hier:

    stackoverflow.com/questions/80…hics-drawimageunscaled-do


    Problem gelöst, wenn auch etwas ungewöhnlich. :D


    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Mabbi“ ()