iphone相机iso值

时间:2015-01-08 12:52:10

标签: ios ios-camera

我设置了快门速度,ISO和其他相机参数,并使用以下代码拍摄图像。如果我将ISO设置为119之类,则在Exif信息中将其报告为125(它始终舍入为标准值)。我怎么知道真正的ISO是什么? maxISO报告为734,但如果我将其设置为734,则在Exif信息中为800。我在曝光时间方面遇到了同样的问题。如果我将其设置为800毫秒,则显示为1,但从ShutterSpeedValue计算的值是正确的。

- (void)setCameraSettings:(long)expTime1000thSec iso:(int)isoValue
{
    if ( currentCaptureDevice ) {

        [captureSession beginConfiguration];

        NSError *error = nil;
        if ([currentCaptureDevice lockForConfiguration:&error]) {

            if ([currentCaptureDevice isExposureModeSupported:AVCaptureExposureModeLocked]) {

                CMTime minTime, maxTime, exposureTime;

                if ( isoValue < minISO ) {
                    isoValue = minISO;
                } else if ( isoValue > maxISO ) {
                    isoValue = maxISO;
                }

                exposureTime = CMTimeMake(expTime1000thSec, EXP_TIME_UNIT); // in 1/EXP_TIME_UNIT of a second
                minTime = currentCaptureDevice.activeFormat.minExposureDuration;
                maxTime = currentCaptureDevice.activeFormat.maxExposureDuration;

                if ( CMTimeCompare(exposureTime, minTime) < 0 ) {
                    exposureTime = minTime;
                } else if ( CMTimeCompare(exposureTime, maxTime) > 0 ) {
                    exposureTime = maxTime;
                }

                NSLog(@"setting exp time to %lld/%d s (want %ld)   iso=%d", exposureTime.value, exposureTime.timescale, expTime1000thSec, isoValue);
                [currentCaptureDevice setExposureModeCustomWithDuration:exposureTime ISO:isoValue completionHandler:nil];
            }

            if (currentCaptureDevice.lowLightBoostSupported) {
                currentCaptureDevice.automaticallyEnablesLowLightBoostWhenAvailable = NO;
                NSLog(@"setting automaticallyEnablesLowLightBoostWhenAvailable = NO");
            }

            // lock the gains
            if ([currentCaptureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked]) {
                currentCaptureDevice.whiteBalanceMode = AVCaptureWhiteBalanceModeLocked;
                NSLog(@"setting AVCaptureWhiteBalanceModeLocked");
            }

            // set the gains
            AVCaptureWhiteBalanceGains gains;
            gains.redGain = 1.0;
            gains.greenGain = 1.0;
            gains.blueGain = 1.0;

            AVCaptureWhiteBalanceGains normalizedGains = [self normalizedGains:gains];
            [currentCaptureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:normalizedGains completionHandler:nil];
            NSLog(@"setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains g.red=%.2lf g.green=%.2lf g.blue=%.2lf",
                  normalizedGains.redGain, normalizedGains.greenGain, normalizedGains.blueGain);

            [currentCaptureDevice unlockForConfiguration];
        }
        [captureSession commitConfiguration];
    }
}



- (void)captureStillImage
{
    NSLog(@"about to request a capture from: %@", [self stillImageOutput]);

    if ( videoConnection ) {

        waitingForCapture = true;

        NSLog(@"requesting a capture from: %@", [self stillImageOutput]);
        [[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection
                                                         completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) {

            if ( imageSampleBuffer ) {

                CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
                if (exifAttachments) {
                    NSLog(@"attachements: %@", exifAttachments);
                } else {
                    NSLog(@"no attachments");
                }

                NSLog(@"name: %@", [currentCaptureDevice localizedName]);

                NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
                UIImage *image = [[UIImage alloc] initWithData:imageData];
                [self setStillImage:image];


                NSDictionary *dict = (__bridge NSDictionary*)exifAttachments;
                NSString *value = [dict objectForKey:@"PixelXDimension"];
                [self setImageWidth:[NSNumber numberWithInt:[value intValue]]];

                value = [dict objectForKey:@"PixelYDimension"];
                [self setImageHeight:[NSNumber numberWithInt:[value intValue]]];

                value = [dict objectForKey:@"BrightnessValue"];
                [self setImageBrightnessValue:[NSNumber numberWithFloat:[value floatValue]]];

                value = [dict objectForKey:@"ShutterSpeedValue"];
                double val = [value doubleValue];
                val = 1.0 / pow(2.0, val);
                [self setImageExposureTime:[NSNumber numberWithDouble:val]];

                value = [dict objectForKey:@"ApertureValue"];
                [self setImageApertureValue:[NSNumber numberWithFloat:[value floatValue]]];

                NSArray *values = [dict objectForKey:@"ISOSpeedRatings"];
                [self setImageISOSpeedRatings:[NSNumber numberWithInt:[ [values objectAtIndex:0] intValue]]];


                NSLog(@"r/g/b gains = %.2lf/%.2lf/%.2lf",
                      currentCaptureDevice.deviceWhiteBalanceGains.redGain,
                      currentCaptureDevice.deviceWhiteBalanceGains.greenGain,
                      currentCaptureDevice.deviceWhiteBalanceGains.blueGain);


                [[NSNotificationCenter defaultCenter] postNotificationName:kImageCapturedSuccessfully object:nil];

            } else {
                NSLog(@"imageSampleBuffer = NULL");
            }

            waitingForCapture = false;

         }];
    } else {
        NSLog(@"can't capture from: videoConnection");
    }

}

2 个答案:

答案 0 :(得分:0)

我回答了你的另一个问题,同样的问题,你没有设置CustomSettings模式:

[device lockForConfiguration:nil];

        if([device isExposureModeSupported:AVCaptureExposureModeCustom]){
            [device setExposureMode:AVCaptureExposureModeCustom];
            [device setExposureModeCustomWithDuration:exposureTime ISO:exposureISO completionHandler:^(CMTime syncTime) {}];
            [device setExposureTargetBias:exposureBIAS completionHandler:^(CMTime syncTime) {}];    
        }

问候。

答案 1 :(得分:0)

我补充说:

[device setExposureMode:AVCaptureExposureModeCustom];

并将我的completionHandler从nil更改为:

completionHandler:^(CMTime syncTime) {}

我仍然看到相同的结果。似乎ISO只能设置为&#34;标准&#34;值,而不是minISO和maxISO之间的任何值。