Foto-Zusatzdaten gehen beim Speichern verloren

  • VB.NET

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

    Foto-Zusatzdaten gehen beim Speichern verloren

    Hallo zusammen,
    mein Projekt lädt ein Foto in eine PictureBox. Dann ergänze ich Exif-Werte und speichere es wieder. Das resultierende Bild ist dann satte 600kb kleiner als das Original. Nach langen Tests stellte sich heraus, dass Metadaten teilweise verloren gehen. Die eigentlichen Exif-Daten bleiben erhalten. Es sind aber noch weitere Daten vom "Maker" hinterlegt (unter der Kategorie listet XnView sie auf). Diese "Maker"-Daten sind nach dem Speichern teilweise weg. XnView liest ca. 370 Werte über das Exiftool aus. Speichere ich das Foto über mein Projekt neu ab, dann sind es nur noch ca. 220 Werte. Teilweise sind die Daten also noch da. Ich dachte natürlich es läuft etwas beim Beschreiben der Exif-Werte falsch. Das Problem tritt aber auch auf, wenn das Foto einfach unverändert gespeichert wird.
    Mich verwirrt besonders, dass die Daten aus diesem Teilbereich nur teilweise verschwinden.
    Mein Projekt ist in VS2017 erstellt. Bei den Fotos handelt es sich um normale JPGs.
    Hier mal der Code auf's Wesentliche gekürzt.

    VB.NET-Quellcode

    1. Public Sub PictureBox1_PaintF(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)
    2. Dim Fotostream As New System.IO.FileStream(Foto_Datei_PB1, IO.FileMode.Open)
    3. Foto = New Bitmap(Fotostream)
    4. e.Graphics.DrawImage(Foto, Bild_Pos_X, Bild_Pos_Y, Bildbreite_Soll, Bildhöhe_Soll)
    5. Fotostream.Close()
    6. end sub
    7. Public Sub speichern()
    8. Dim Foto As Image = Image.FromFile(Foto_Datei_PB1)
    9. Foto.Save(Foto_Datei_PB1 & " SPEICHERETEST.jpg")
    10. End Sub


    Hat jemand eine Idee was ich da falsch mache?

    Gruß

    eddi

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

    eichseinet schrieb:

    Hat jemand eine Idee was ich da falsch mache?
    Möglicherweise liegt es daran, dass Dein Bild in einer Bitmap-Instanz gehalten wird.
    Wenn Du das ganze mit der WPF-Funktionalität machst (läuft auch unter WinForm) könnte es besser gehen.
    Sieh Dir mal die Namespaces System.Windows.Media und System.Windows.Media.Imaging an.
    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!
    Kürzlich wollte ich WPF mal testen. Da ist ja scheinbar alles wieder ganz anders und mein Projekt ließ da nicht wirklich hinein kopieren.
    Gibt's da echt im normalen VB keine Möglichkeit?
    Ich hab eben ein neues Projekt zum Testen erstellt. Dort wird nichts anderes gemacht als speichern. Geht trotzdem nicht.
    Das hier ist der gesamte Code.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Foto As Image = Image.FromFile("G:\KOPIEN nur zum Testen\DSC01958.JPG")
    3. Foto.Save("G:\KOPIEN nur zum Testen\DSC01958.JPG" & " SPEICHERETEST.jpg")
    4. End Sub


    Echt keine andere Möglichkeit als gleich umzusteigen auf WPF?

    Gruß

    eddi

    eichseinet schrieb:

    Gibt's da echt im normalen VB keine Möglichkeit?
    Mit diesen DLLs hast Du unter WinForm den vollen Zugriff:

    Spoiler anzeigen

    C#-Quellcode

    1. /// <summary>
    2. /// Saves the image information as a Png image
    3. /// </summary>
    4. /// <param name="filename">full path to save the image</param>
    5. /// <param name="pixels">pixel information of the image</param>
    6. /// <param name="palette">palette information of the image</param>
    7. /// <param name="info">additional image information</param>
    8. /// <returns>success of saving</returns>
    9. public static bool SavePng(string filename, Array pixels, BitmapPalette palette, PictureInfoWpf info)
    10. {
    11. PixelFormat fmt = (info.PictureTypeWpf == PictureWpf.PictureTypeWpf.Grey8)
    12. ? PixelFormats.Gray8
    13. : PixelFormats.Gray16;
    14. int stride = (info.PictureTypeWpf == PictureWpf.PictureTypeWpf.Grey8) ? info.Width : info.Width * 2;
    15. BitmapSource image = BitmapSource.Create(
    16. info.Width,
    17. info.Height,
    18. 96,
    19. 96,
    20. fmt,
    21. palette, // BitmapPalettes.Gray16,
    22. pixels,
    23. stride);
    24. // Image has to be converted to ARGB Format
    25. FormatConvertedBitmap newImage = new FormatConvertedBitmap(image, PixelFormats.Rgb24, null, 0.0);
    26. using (FileStream stream = new FileStream(filename, FileMode.Create))
    27. {
    28. // ###################################
    29. PngBitmapEncoder encoder = new PngBitmapEncoder();
    30. encoder.Frames.Add(BitmapFrame.Create(newImage));
    31. encoder.Save(stream);
    32. }
    33. return true;
    34. }
    in der mit ################################### markierten Zeile müsstest Du Deine Tags einzubetten.
    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!