2 Stimmen

Mac OS X 10.6 APIs melden falsche EXIF-Daten für die Blende.

Ich verwende zwei APIs, um EXIF-Daten aus Bildern zu lesen, die ich "valueForProperty:NSImageEXIFData" und "CGImageSourceCopyPropertiesAtIndex" nennen werde. Beide liefern die gleichen EXIF-Daten, obwohl die zweite auch andere Daten (z.B. GPS, TIFF) liefert.

Beide liefern falsche Werte für "ApertureValue" und "MaxApertureValue" und den richtigen Wert für "FNumber". Das nachfolgende Beispielprogramm gibt alle Metadaten aus, die von jeder Methode zurückgegeben werden, und ruft auch ExifTool auf. Die Ausgabe wird am Ende zusammengefasst.

(Wenn ich weiß, welches Objektiv ich benutzt habe, hat ExifTool recht, wenn es MaxApertureValue als 2.8 angibt.)

Details: Xcode 4.02, OS X 10.6.7, 10.6 SDK

Hat jemand anderes diese Anomalie bemerkt?

#import "ExifTestAppDelegate.h"

@implementation ExifTestAppDelegate

@synthesize window;

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        NSString *path = @"/Users/marc/Pictures/iPadPhotos- overflow/Portfolio/MJR_20061221_0258.jpg";
        NSData *data = [NSData dataWithContentsOfFile:path];
        NSImage *img = [[[NSImage alloc] initWithData:data] autorelease];
        NSImageRep *rep = [img bestRepresentationForRect:NSMakeRect(0, 0, 500, 500) context:nil hints:nil];
        NSDictionary *exifDict = (NSDictionary *)[(id)rep valueForProperty:NSImageEXIFData];
        NSLog(@"NSImageEXIFData: %@", exifDict);
        CGImageSourceRef imgSource = CGImageSourceCreateWithData((CFDataRef)data, nil);
        CFDictionaryRef dictRef = CGImageSourceCopyPropertiesAtIndex(imgSource, 0, nil);
        NSLog(@"CGImageSourceCopyPropertiesAtIndex: %@", dictRef);
        CFRelease(imgSource);
        system([[NSString stringWithFormat:@"exiftool '%@'", path] UTF8String]);
    }

@end

/*

2011-05-21 11:22:58.140 ExifTest[4510:903] NSImageEXIFData: {
    ApertureValue = 6;
...
    FNumber = 8;
...
    MaxApertureValue = 3;
...
}
2011-05-21 11:22:58.154 ExifTest[4510:903] CGImageSourceCopyPropertiesAtIndex: {
...
    "{Exif}" =     {
        ApertureValue = 6;
...
        FNumber = 8;
...
        MaxApertureValue = 3;
...
ExifTool Version Number         : 8.51
...
F Number                        : 8.0
...
Aperture Value                  : 8.0
...
Max Aperture Value              : 2.8

*/

Update: Es liegt nicht an mir. Hier sind die EXIF-Daten, wie sie von Apples Vorschau-App gemeldet werden:

EXIF-Daten aus der Vorschau

1voto

dawg Punkte 89931

Probieren Sie das ImageIO Framework von Quartz 2D aus.

Speziell CGImageSourceCopyProperties mit CGImageProperties eingestellt auf kCGImagePropertyExifDictionary

Um 2.8 gegenüber 3 für die maximale Blende zu erhalten, müssen Sie möglicherweise kCGImageSourceShouldAllowFloat entsprechend setzen.

Es ist zwar nicht Cocoa, aber einfach zu bedienen und zu Cocoa zu übertragen.

Bearbeiten

Der obige Teil über das Einstellen von kCGImageSourceShouldAllowFloat ist falsch...

Ich habe gerade ein f2.8 60mm Micro Nikkor Festbrennweite auf eine Nikon D7000 gesteckt, um dies zu überprüfen. Ich habe ein Bild eines sehr nahen Objekts (3 Zoll entfernt) gemacht, ein weiteres mit mittlerer Fokussierung (6 Fuß) und ein drittes mit entfernter Fokussierung.

Das Bild des nahen Fokus zeigt einen gemeldeten "Max Blende"-Wert von 3,2 in der Vorschau. Photoshop ermöglicht es, die Rohdaten-EXIF-Daten, die in der Datei eingebettet sind, zu sehen. Wenn ich das Bild des nahen Objekts in Photoshop öffne, wird das eingebettete EXIF als exif:MaxAperatureValue: 32/10 angezeigt.

Mit denselben Methoden hat das Bild mit mittlerer Fokussierung einen gemeldeten "Max Blende"-Wert von 3,0 (oder 30/10 in Photoshop). Nur das Bild mit entfernter Fokussierung hat einen gemeldeten "Max Blende"-Wert von 2,8.

Es scheint also, dass die Kamera die wirksame maximale Blende des Objektivs entsprechend der aktuellen Fokuseinstellung meldet. Das macht Sinn, aufgrund der Häufigkeit von Objektiven mit variabler maximaler Blende. Wenn Sie ein Zoomobjektiv verwenden, das eine variable maximale Blende hat (wie ein Nikkor 18-200 f3.5 / f5.6), wird die wirksame maximale Blende bei der gegebenen Zoom- und Fokuseinstellung von der Kamera berechnet und in den EXIF-Daten eingebettet. Dieser Wert wird korrigiert von der Vorschau angezeigt und wahrscheinlich auch vom ImageIO-Framework.

Siehe T-Stops

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X