API Mac OS X 10.6 сообщают о неправильных данных EXIF ​​для апертуры - PullRequest
2 голосов
/ 21 мая 2011

Я использую два API для чтения данных EXIF ​​из изображений, которые я назову «valueForProperty: NSImageEXIFData» и «CGImageSourceCopyPropertiesAtIndex». Оба предоставляют одни и те же данные EXIF, хотя второй предоставляет и другие данные (например, GPS, TIFF).

Оба дают неправильные значения для «ApertureValue» и «MaxApertureValue», а также правильное значение для «FNumber». Пример программы, которая следует, сбрасывает все метаданные, возвращаемые каждым методом, а также вызывает ExifTool. Выходные данные суммируются в конце.

(Зная, какой объектив я использовал, ExifTool верен, когда сообщает MaxApertureValue как 2.8.)

Подробности: Xcode 4.02, OS X 10.6.7, 10.6 SDK

Кто-нибудь еще заметил эту аномалию?

#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

*/

Обновление: это не я. Вот данные EXIF, представленные приложением Apple Preview:

EXIF data from Preview

1 Ответ

1 голос
/ 21 мая 2011

Попробуйте каркас ImageIO из Quartz 2D.

В частности CGImageSourceCopyProperties с CGImageProperties , установленным на kCGImagePropertyExifDictionary

Чтобы получить 2.8 против 3 для максимальной апертуры, вам может потребоваться установить kCGImageSourceShouldAllowFloat соответственно .

Это не Какао, но его легко использовать и отправлять в Какао.

Редактировать

Часть выше о настройке kCGImageSourceShouldAllowFloat неверна ...

Я только что установил 60-мм объектив Micro Nikkor f2.8 на Nikon D7000, чтобы проверить это. Я сделал одно изображение очень близкого объекта (3 дюйма), другое - в среднем фокусе (6 футов) и третье - в удаленном фокусе.

Изображение EXIF ​​с близким фокусом сообщило значение «Макс. Диафрагма» 3,2 в окне предварительного просмотра. Photoshop позволяет просматривать необработанные данные EXIF, встроенные в файл. Если я открываю изображение закрытого объекта в Photoshop, встроенный EXIF ​​отображается как exif:MaxAperatureValue: 32/10

При использовании тех же методов для изображения со средним фокусом сообщается «Макс. Диафрагма» 3,0 (или 30/10 в Photoshop). Только дальний фокус сообщает значение «Макс. Диафрагма» 2,8.

Таким образом, может показаться, что камера сообщает эффективную максимальную апертуру объектива, учитывая текущую настройку фокусировки. Это имеет смысл из-за преобладания зум-объективов с переменным максимальным значением диафрагмы. Если вы наденете зум-объектив с переменной максимальной диафрагмой (например, Nikkor 18-200 f3.5 / f5.6), эффективная максимальная диафрагма при заданных настройках масштабирования и фокусировки будет рассчитана камерой и встроена в Данные EXIF. Это значение корректируется в соответствии с предварительным просмотром и, предположительно, инфраструктурой ImageIO.

См. T-Stops

...