Direkt aus diesem Link bekommst du meist keine fertige Datei, sondern nur eine veröffentlichte Adobe-Ansicht; als PDF oder Bild speicherst du sie am schnellsten über „Herunterladen&ldq...
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**.