Direkt in VB.NET 2003 geht das nicht zuverlässig über System.Drawing, weil .NET 1.1 PNG zwar speichern kann, transparente GIF-Pixel dabei aber oft nicht so behandelt werden, wie man es f&uum...
Wie lese und schreibe ich EXIF-Daten in VB.NET 2003?
Antwort vom**EXIF ist keine eigene „Datei“, sondern Metadaten im Bild selbst. In VB.NET 2003 liest du EXIF über `Image.PropertyItems` bzw. `GetPropertyItem`, und schreiben kannst du nur über `SetPropertyItem` in ein Bildformat, das solche Metadaten unterstützt, typischerweise JPEG/TIFF.** ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem?view=windowsdesktop-10.0)) ## EXIF lesen In VB.NET 2003 arbeitest du mit `System.Drawing.Image` und `System.Drawing.Imaging.PropertyItem`. Einfaches Auslesen aller vorhandenen EXIF-Einträge: ```vb Imports System.Drawing Imports System.Drawing.Imaging Imports System.Text Dim img As Image = Image.FromFile("C:\bild.jpg") Dim pi As PropertyItem For Each pi In img.PropertyItems Console.WriteLine("ID: " & Hex(pi.Id)) Console.WriteLine("Typ: " & pi.Type) Console.WriteLine("Länge: " & pi.Len) Console.WriteLine("Wert (roh): " & BitConverter.ToString(pi.Value)) Console.WriteLine("-------------------") Next img.Dispose() ``` Wichtiger in der Praxis ist meist das gezielte Lesen einzelner Tags, zum Beispiel `0x010F` für Hersteller oder `0x0110` für Kameramodell. Die Property-IDs sind fest definiert. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem.id?view=windowsdesktop-9.0)) Beispiel: Kameramodell lesen: ```vb Imports System.Drawing Imports System.Drawing.Imaging Imports System.Text Dim img As Image = Image.FromFile("C:\bild.jpg") Try Dim prop As PropertyItem = img.GetPropertyItem(&H110) ' Kameramodell Dim text As String = Encoding.ASCII.GetString(prop.Value) text = text.Trim(Chr(0)) Console.WriteLine("Modell: " & text) Catch ex As Exception Console.WriteLine("EXIF-Tag nicht vorhanden.") End Try img.Dispose() ``` ## EXIF schreiben Der entscheidende Stolperstein: `PropertyItem` hat keinen öffentlichen Konstruktor. Du kannst also in .NET 1.1 nicht einfach `New PropertyItem()` machen, sondern musst zuerst ein vorhandenes `PropertyItem` aus einem Bild holen, es anpassen und dann wieder setzen. Genau das ist der offizielle Workaround. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem?view=windowsdesktop-10.0)) Beispiel: Kommentar oder Textwert setzen: ```vb Imports System.Drawing Imports System.Drawing.Imaging Imports System.Text Dim img As Image = Image.FromFile("C:\bild.jpg") ' Irgendein vorhandenes PropertyItem als Vorlage holen Dim prop As PropertyItem = img.PropertyItems(0) Dim txt As String = "Mein EXIF-Text" & Chr(0) Dim bytes() As Byte = Encoding.ASCII.GetBytes(txt) prop.Id = &H10E ' ImageDescription prop.Type = 2 ' ASCII prop.Len = bytes.Length prop.Value = bytes img.SetPropertyItem(prop) img.Save("C:\bild_neu.jpg", Imaging.ImageFormat.Jpeg) img.Dispose() ``` ## Der wichtige Haken bei VB.NET 2003 Das Schreiben funktioniert in alten GDI+-/`System.Drawing`-Szenarien oft nur eingeschränkt zuverlässig. Der Grund ist nicht dein Code, sondern die Technik dahinter: - manche Bilder enthalten anfangs gar keine passenden EXIF-Tags - manche Tags werden beim Speichern ignoriert - nicht jedes Format unterstützt alle PropertyItems - beim Neuspeichern können Metadaten teilweise verloren gehen ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.image.setpropertyitem?view=windowsdesktop-9.0)) Das ist der praktische Unterschied zu „lesen“: Lesen klappt meist problemlos, Schreiben ist in VB.NET 2003 deutlich fehleranfälliger. ## Was du konkret beachten solltest Wenn du nur EXIF **auslesen** willst, reicht `GetPropertyItem` völlig aus. Wenn du EXIF **ändern** willst, ist `SetPropertyItem` nur für einfache Fälle brauchbar, etwa Textfelder wie Beschreibung oder Kommentar. Für komplexere EXIF-Daten wie GPS, Datum, Thumbnail oder UserComment wird es schnell unhandlich, weil du die Byte-Struktur exakt selbst bauen musst. Genau daran scheitern die meisten Beispiele im Netz: Sie zeigen nur das Setzen irgendeines ASCII-Tags, aber nicht die saubere Kodierung komplexerer EXIF-Felder. Die unterstützten Property-Typen und Tag-Beschreibungen sind in der [PropertyItem-Dokumentation](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem?view=windowsdesktop-10.0) und in den [GDI+-Property-Tags](https://learn.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-constant-property-item-descriptions) beschrieben. ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem?view=windowsdesktop-10.0)) ## Klare Empfehlung **Für VB.NET 2003: EXIF lesen mit `GetPropertyItem`, aber EXIF schreiben nur für einfache ASCII-Tags. Sobald du mehrere Tags sauber erzeugen oder zuverlässig speichern willst, ist `System.Drawing` dafür die falsche Wahl.** ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.image.setpropertyitem?view=windowsdesktop-9.0)) Ein typisches Minimalbeispiel für häufig genutzte Tags: - `&H10F` = Hersteller - `&H110` = Modell - `&H132` = Änderungsdatum - `&H10E` = Bildbeschreibung - `&H9286` = UserComment / Kommentarähnlicher Bereich, aber deutlich komplizierter zu kodieren ([learn.microsoft.com](https://learn.microsoft.com/en-us/dotnet/api/system.drawing.imaging.propertyitem.id?view=windowsdesktop-9.0)) Wenn du es robust willst, ist die beste fachliche Einschätzung: In VB.NET 2003 EXIF **lesen ja**, EXIF **komfortabel schreiben nein**.
Verwandte Fragen
Wie erstelle, speichere und nutze ich in VB.NET 2003 eine DLL im Projekt?
In VB.NET 2003 erstellst du eine DLL als Class Library, kompilierst sie zu einer .dll und bindest sie im Hauptprojekt per Projektverweis oder Dateiverweis ein. Entscheidend ist: Nicht die DLL „m...
Wie lasse ich im VB.NET-2003-MonthCalendar selbst gewählte Datumswerte anzeigen?
Ja: Im MonthCalendar zeigst du selbst gewählte Daten über die Fettmarkierung an. Entscheidend ist: Die Daten müssen als DateTime hinzugefügt und danach mit UpdateBoldedDates() aktu...
Wie sortiere ich in VB.NET 2003 ein Array mit 4 Spalten und x Zeilen?
Ein echtes 2D-Array in VB.NET 2003 kannst du nicht direkt mit Array.Sort sortieren; praktisch musst du die Zeilen entweder selbst tauschen oder die Daten zuerst in eine sortierbare Struktur umbauen. A...