GPUImage 前置摄像头点击对焦为什么不起作用?

GPUImage front camera Tap to focus not working why?

我已经实现了下面的代码来启用点击对焦相机。它在后置摄像头上工作正常,但在使用前置摄像头时失败,因为 _videoCamera.inputCamera.isFocusPointOfInterestSupported 为假。

为什么错了?请帮助我。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self.view];

    if([_videoCamera.inputCamera isFocusPointOfInterestSupported]&&[_videoCamera.inputCamera isFocusModeSupported:AVCaptureFocusModeAutoFocus])
    {

        if([_videoCamera.inputCamera lockForConfiguration :nil])
        {
            [_videoCamera.inputCamera setFocusPointOfInterest :touchPoint];
            [_videoCamera.inputCamera setFocusMode :AVCaptureFocusModeLocked];

            if([_videoCamera.inputCamera isExposurePointOfInterestSupported])
            {    CGRect screenRect = [[UIScreen mainScreen] bounds];
                CGFloat screenWidth = screenRect.size.width;
                CGFloat screenHeight = screenRect.size.height;
                double focus_x = touchPoint.x/screenWidth;
                double focus_y = touchPoint.y/screenHeight;
                [_videoCamera.inputCamera setExposurePointOfInterest:CGPointMake(focus_x,focus_y)];
                [_videoCamera.inputCamera setFocusMode:AVCaptureFocusModeAutoFocus];
                if ([_videoCamera.inputCamera isExposureModeSupported:AVCaptureExposureModeAutoExpose]){
                    [_videoCamera.inputCamera setExposureMode:AVCaptureExposureModeAutoExpose];
                }

            }
            [_videoCamera.inputCamera unlockForConfiguration];
        }
    }

}

我想是在这里 [_videoCamera.inputCamera setFocusPointOfInterest :touchPoint];

FocusPointOfInterest 的 x 和 y 点必须在 [0:1] 范围内

你可以添加这两个方法

- (CGPoint)convertToPointOfInterestFromViewCoordinates:(CGPoint)viewCoordinates inFrame:(CGRect)frame withOrientation:(UIDeviceOrientation)orientation andFillMode:(GPUImageFillModeType)fillMode mirrored:(BOOL)mirrored{
CGSize frameSize = frame.size;
CGPoint pointOfInterest = CGPointMake(0.5, 0.5);

if (mirrored)
{
    viewCoordinates.x = frameSize.width - viewCoordinates.x;
}

if (fillMode == kGPUImageFillModeStretch) {
    pointOfInterest = CGPointMake(viewCoordinates.y / frameSize.height, 1.f - (viewCoordinates.x / frameSize.width));
} else {
    CGSize apertureSize = CGSizeMake(CGRectGetHeight(frame), CGRectGetWidth(frame));
    if (!CGSizeEqualToSize(apertureSize, CGSizeZero)) {
        CGPoint point = viewCoordinates;
        CGFloat apertureRatio = apertureSize.height / apertureSize.width;
        CGFloat viewRatio = frameSize.width / frameSize.height;
        CGFloat xc = .5f;
        CGFloat yc = .5f;

        if (fillMode == kGPUImageFillModePreserveAspectRatio) {
            if (viewRatio > apertureRatio) {
                CGFloat y2 = frameSize.height;
                CGFloat x2 = frameSize.height * apertureRatio;
                CGFloat x1 = frameSize.width;
                CGFloat blackBar = (x1 - x2) / 2;
                if (point.x >= blackBar && point.x <= blackBar + x2) {
                    xc = point.y / y2;
                    yc = 1.f - ((point.x - blackBar) / x2);
                }
            } else {
                CGFloat y2 = frameSize.width / apertureRatio;
                CGFloat y1 = frameSize.height;
                CGFloat x2 = frameSize.width;
                CGFloat blackBar = (y1 - y2) / 2;
                if (point.y >= blackBar && point.y <= blackBar + y2) {
                    xc = ((point.y - blackBar) / y2);
                    yc = 1.f - (point.x / x2);
                }
            }
        } else if (fillMode == kGPUImageFillModePreserveAspectRatioAndFill) {
            if (viewRatio > apertureRatio) {
                CGFloat y2 = apertureSize.width * (frameSize.width / apertureSize.height);
                xc = (point.y + ((y2 - frameSize.height) / 2.f)) / y2;
                yc = (frameSize.width - point.x) / frameSize.width;
            } else {
                CGFloat x2 = apertureSize.height * (frameSize.height / apertureSize.width);
                yc = 1.f - ((point.x + ((x2 - frameSize.width) / 2)) / x2);
                xc = point.y / frameSize.height;
            }
        }

        pointOfInterest = CGPointMake(xc, yc);
    }
}

return pointOfInterest;
}


- (void)setFocus:(CGPoint)focus forDevice:(AVCaptureDevice *)device
{
    if ([device isFocusPointOfInterestSupported] && [device isFocusModeSupported:AVCaptureFocusModeAutoFocus])
    {
        NSError *error;
        if ([device lockForConfiguration:&error])
        {
            [device setFocusPointOfInterest:focus];
            [device setFocusMode:AVCaptureFocusModeAutoFocus];
            [device unlockForConfiguration];
        }
    }

    if ([device isExposurePointOfInterestSupported] && [device isExposureModeSupported:AVCaptureExposureModeAutoExpose])
    {
        NSError *error;
        if ([device lockForConfiguration:&error])
        {
            [device setExposurePointOfInterest:focus];
            [device setExposureMode:AVCaptureExposureModeAutoExpose];
            [device unlockForConfiguration];
        }
    }
}

现在你这样打电话

CGPoint pointOfInterest = [self convertToPointOfInterestFromViewCoordinates:tapPoint inFrame:cameraView.bounds withOrientation:self.currentOrientation andFillMode:cameraView.fillMode mirrored:currentVideoCamera == frontVideoCamera];

[self setFocus:pointOfInterest forDevice:currentVideoCamera.inputCamera];

希望对您有所帮助:)

front-facing相机是定焦的。没有auto-focus,没有关注兴趣点。这正是 iOS 在您调用 isFocusPointOfInterestSupported.

时通过返回 NO 告诉您的内容