Exif Daten schreiben mit NSBitmapImageRep (Tiger)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Exif Daten schreiben mit NSBitmapImageRep (Tiger)

    Hallo!

    Ich habe folgendes Problem:

    Unter Tiger kann man ja sehr leicht auf EXIF-Daten von JPEGs zugreifen. Das Lesen dieser Daten scheint auch problemlos zu funktionieren (auch wenn einige Felder zu fehlen scheinen).

    Wenn ich allerdings einen NSString im Dictionary unter dem Key "UserComment" speichere und dann das Bild speichern möchte, erhalte ich die Meldung:

    rejected UserComment

    im Run Log.

    Hier ein Code-Schnipsel:

    Quellcode

    1. NSData *bitmapData;
    2. NSMutableDictionary* jpegAttributes = [[NSMutableDictionary alloc] init];
    3. [jpegAttributes setObject:[NSNumber numberWithFloat:1.0]forKey:@"NSImageCompressionFactor"];
    4. // Image laden
    5. NSImage* image = [[NSImage alloc] initWithContentsOfFile:imagePath];
    6. // Representations holen
    7. NSArray* reps = [image representations];
    8. // Die NSBitmapImageRep holen
    9. NSBitmapImageRep* bmir = [reps objectAtIndex:0];
    10. // Property setzen
    11. [bmir setProperty:@"NSImageEXIFData" withValue:exifDict];
    12. // Und das ganze schreiben
    13. bitmapData = [bmir representationUsingType:NSJPEGFileType properties:jpegAttributes];
    14. BOOL ok = [bitmapData writeToFile:exifImagePath atomically:YES];
    Alles anzeigen


    Das Setzen von z.B. einer NSNumber für "WhiteBalance" funktioniert allerdings.

    Alle Werte außer UserComment werden korrekt geschrieben, wie man sieht, wenn man die Metadaten wieder einliest. Nur das UserComment-Feld (was vorher offenbar einen NSString bzw. NSCFString, der nur aus Leerzeichen bestand, enthielt) ist verschwunden.


    Gerade das Schreiben von UserComments wäre eine Funktion, die ich sehr gerne einsetzen würde. Weiß jemand Rat?

    klg
  • uh wow er kennt ja gar nix :)

    als Beispiel was ich und was Apple raus bekommt

    Quellcode

    1. 2005-05-27 17:43:14.173 CocoViewX[28116] {
    2. "Auto Exposure Status" = OK;
    3. "Blur Status" = OK;
    4. Brightness = "-1.4 EV";
    5. "Bytes of JPEG Data" = 8703;
    6. "Camera Model" = "FinePix A210 ";
    7. "Camera Software" = "Digital Camera FinePix A210 Ver1.00";
    8. "Chroma Saturation" = Normal;
    9. "Chrominance Comp Positioning" = "Co-Sited";
    10. "Color Space Information" = sRGB;
    11. "Compression Scheme" = "JPEG Compression (Thumbnail)";
    12. "Continuous/Bracketing Mode" = Off;
    13. "Equipment Make" = FUJIFILM;
    14. "Exif IFD Pointer" = 252;
    15. "Exif Version" = "2.20";
    16. "Exposure Bias" = "0 EV";
    17. "Exposure Mode" = Auto;
    18. "Exposure Program" = "Normal Program";
    19. "Exposure Time" = "1/60 sec";
    20. "F-Number" = "f/3.0";
    21. "File Source" = Other;
    22. Flash = "Flash, Auto";
    23. "Flash Mode" = Auto;
    24. "Focal Length" = "5.50 mm";
    25. "Focal Plane Horiz Resolution" = "3884 dpcm";
    26. "Focal Plane Res Unit" = cm;
    27. "Focal Plane Vert Resolution" = "3884 dpcm";
    28. "Focus Mode" = Auto;
    29. "Focus Status" = "Out of Focus";
    30. "Horizontal Resolution" = "72 dpi";
    31. "ISO Speed Rating" = 100;
    32. "Image Compression Mode" = 2;
    33. "Image Created" = "2004:02:25 19:40:13";
    34. "Image Digitized" = "2004:02:25 19:40:13";
    35. "Image Generated" = "2004:02:25 19:40:13";
    36. "Image Height" = 1536;
    37. "Image Orientation" = "Top, Left-Hand";
    38. "Image Width" = 2048;
    39. "Lens Aperture" = "f/3.0";
    40. "Light Source" = Unknown;
    41. "Macro Mode" = Off;
    42. "Maker Note Version" = 0130;
    43. "Maximum Lens Aperture" = "f/3.0";
    44. "Meaning of Each Comp" = Unknown;
    45. "Metering Mode" = Pattern;
    46. "Offset to JPEG SOI" = 1252;
    47. "Picture Mode" = Auto;
    48. Rendering = Normal;
    49. "Resolution Unit" = i;
    50. "Scene Capture Type" = Standard;
    51. "Scene Type" = Unknown;
    52. "Sensing Method" = "One-Chip Color Area";
    53. Sharpness = Normal;
    54. "Shutter Speed" = "1/64 sec";
    55. "Slow Synchro Mode" = Off;
    56. "Subject Distance Range" = Unknown;
    57. "Vertical Resolution" = "72 dpi";
    58. "White Balance" = Auto;
    59. }
    60. 2005-05-27 17:43:14.750 CocoViewX[28116] mal schauen was Apple so kennt:
    61. {
    62. ApertureValue = 3.2;
    63. BrightnessValue = -1.4;
    64. ColorSpace = 1;
    65. CompressedBitsPerPixel = 2;
    66. CustomRendered = 0;
    67. DateTimeDigitized = "2004:02:25 19:40:13";
    68. DateTimeOriginal = "2004:02:25 19:40:13";
    69. ExifVersion = (2, 2);
    70. ExposureBiasValue = 0;
    71. ExposureMode = 0;
    72. ExposureProgram = 2;
    73. ExposureTime = 0.01666667;
    74. FNumber = 3;
    75. Flash = 25;
    76. FlashPixVersion = (1, 0);
    77. FocalLength = 5.5;
    78. FocalPlaneResolutionUnit = 3;
    79. FocalPlaneXResolution = 3884;
    80. FocalPlaneYResolution = 3884;
    81. ISOSpeedRatings = (100);
    82. LightSource = 0;
    83. MaxApertureValue = 3.2;
    84. MeteringMode = 5;
    85. SceneCaptureType = 0;
    86. SensingMethod = 2;
    87. Sharpness = 0;
    88. ShutterSpeedValue = 6;
    89. SubjectDistRange = 0;
    90. WhiteBalance = 0;
    91. }
    Alles anzeigen


    schaut so aus als kenne er UserComment gar nicht.

    Sven
    :wq! /dev/null
  • Nun ja, wenn ich die EXIF Daten mit Cocoa einlese, dann erhalte ich für ein Photo (direkt aus der Kamera) z.B.:

    Quellcode

    1. Key: [UserComment], Value: [ ] OF TYPE NSCFString, LENGTH: 36


    Die Ausgabe wird folgendermaßen erzeugt:

    Quellcode

    1. NSLog(@"Key: [%@], Value: [%@] OF TYPE %@, LENGTH: %i",key, [exifDict valueForKey:key], [[exifDict valueForKey:key] className], [[exifDict valueForKey:key] length]);


    Also ist ein UserComment Field offenbar vorhanden. (Ist auch in den EXIF-Spezifikationen vorgesehen.)

    Auch eine interessante Beobachtung:

    Ich lese die EXIF-Daten eines Photos mit meinem Programm: Ausgabe s.o.

    Anschließend öffne ich das Photo in Vorschau (Preview) und gebe Keywords ein (über Informationen).

    Dann lese ich die EXIF-Daten wieder mit meinem Programm aus, und siehe da: UserComment wird nicht mehr angezeigt.

    Irgendwas ist da faul ...

    klg
  • Übrigens: Andere String-Values kann ich problemlos ändern.

    Quellcode

    1. [newExifDict setObject:@"2005:01:01 12:00:00" forKey:@"DateTimeOriginal"];


    funktioniert beispielsweise. Das Datum wird korrekt in die EXIF-Info geschrieben und kann auch wieder ausgelesen werden.

    Sehr seltsam ...

    klg
  • Ich hab' mal mit dem Programm exifedit einen Kommentar in UserComment eingefügt.

    Der wird dann mit meinem Programm auch korrekt angezeigt:

    Quellcode

    1. Key: [UserComment], Value: [Testkommentar] OF TYPE NSCFString, LENGTH: 13


    Nur Ändern geht leider nicht.

    Übrigens: auch wenn ich das Dictionary *nicht* ändere, funktioniert das Schreiben der UserComments nicht. Also wohl ein Fehler in Cocoa :(

    klg
  • ich hab mittels jead einen Kommentar in die Datei geschrieben und kann diese weder über Cocoa selber noch über exifTags auslesen.

    Wo steht denn genau welche Keys es gibt. Cocoa gibt im Dict ja nur die zurück die es gefunden hat. Er liest bei mir auch nicht Kamera Typ, Modell Nummer und Software heraus.
    Wie genau greifst Du die Daten den ab?

    Sven
    :wq! /dev/null
  • Original von Stalkingwolf
    ich hab mittels jead einen Kommentar in die Datei geschrieben und kann diese weder über Cocoa selber noch über exifTags auslesen.


    Den Testkommentar habe ich mit der Demo-Version von EXIFutilsOSX2.6 / exifedit geschrieben.
    "User Comment" bzw. "comment" ist auch in der Spezifikation, das ist alles schon okay.


    Wo steht denn genau welche Keys es gibt.


    exif.org/. Es gibt da ein PDF mit den EXIF-Spezifikationen


    Cocoa gibt im Dict ja nur die zurück die es gefunden hat. Er liest bei mir auch nicht Kamera Typ, Modell Nummer und Software heraus.
    Wie genau greifst Du die Daten den ab?


    So:

    Quellcode

    1. NSImage* img = [[NSImage alloc] initWithContentsOfFile:imagePath];
    2. NSArray* reps = [img representations];
    3. NSBitmapImageRep* bmir = [reps objectAtIndex:0];
    4. // Hier bekomme ich das Dictionary mit den EXIF-Infos
    5. NSDictionary* dict = [bmir valueForProperty:@"NSImageEXIFData"];
    6. [img release];


    Das funktioniert ja auch alles. (Es werden allerdings nicht alle Infos anzeigt. Liegt wohl auch an der Kamera. Den ISO-Wert kann ich mit einigen exif-Utils sehen (z.B. unter PHP), andere wiederum zeigen den Wert nicht an.)

    Das interessiert mich aber alles eher weniger. Mir geht es eigentlich nur darum, Daten in den UserComment-Bereich zu schreiben (Keywords zum Beispiel).

    Das scheint allerdings nicht zu funktionieren :(

    klg
  • Tja genau so habe ich es gemacht.
    Die Keys heißen aber alle anders wie ich sie mit den BSD exifTags heraus bekomme.
    Daher war auch meine Frage wo die Key Defintionen genau stehen.
    Apple muss doch angaben gemacht haben welche genau unterstützt werden.
    Und wenn ich mittels dem Code oben EXIF Daten auslese dann erhalte ich bei 3 verschiedenen Kamera Modellen nur Bruchteile von dem was ich der BSD exifTags erhalte.

    Ich frage dies deswegen, weil UserComment mir noch nirgends über den Weggelaufen ist.
    Ich weiß das man Kommentare in JPEG Dateien schreiben kann. Aber das war für mich bisher immer neben den EXIF Spezifikationen.

    In meinen Augen ist das noch extrem rudimentär unterstützt von Apple.

    schau mal vielleicht hilft auch das weiter?

    Quellcode

    1. ImageDescription
    2. A character string giving the title of the image. It may be a comment such as "1988 company picnic" or the like.
    3. Two-byte character codes cannot be used. When a 2-byte code is necessary, the Exif Private tag UserComment is
    4. to be used.


    Sven
    :wq! /dev/null
  • Ja, die ImageDescription habe ich auch schon ausprobiert. Funktioniert allerdings auch nicht. Ich bekomme zwar kein "rejected", aber die Daten werden nicht geschrieben.

    Zum Thema Dokumentation:

    Das einzige, was ich von Apple bzgl. Cocoa dazu gelesen habe, ist:

    "The EXIF data for the image. Used only for JPEG files. The value is a NSDictionary containing the EXIF keys and values. It’s set when reading in and used when writing out. Available in Mac OS X v10.4 and later."

    (in der Beschreibung von NSBitmapImageRep)

    Ich denke inzwischen, daß es schlicht und einfach ein Fehler in Cocoa ist. Schließlich ist UserComment in der Spezifikation, vorhandene UserComment-Einträge werden auch angezeigt, nur das Schreiben funktioniert nicht.

    Die einzige Funktion, die ich brauche (Grrrr....). Da werde ich wohl doch auf libexif o.ä. zugreifen müssen (oder weiß jemand, ob und wie das mit Quicktime geht?).

    klg
  • Mit schreiben habe ich mich noch nie beschäftig.
    Mir ist aber aufgefallen das so ziemlich nichts funktioniert was mehr oder weniger ein Text ist.
    ISOSpeedRatings wird rejected. CameraSoftware will nicht, Manufactor und CameraModell.

    Naja vielleicht dann irgendwann mit 10.5 :)

    Sven
    :wq! /dev/null