簡體   English   中英

如何檢測照片是否來自前置攝像頭

[英]How to detect if photo taken from front camera

我想使用以下代碼垂直更改從前置攝像頭拍攝的照片的方向:

let reversedImage = UIImage(CGImage: image.CGImage!, scale: 1.0, orientation: .LeftMirrored)

但是,如何檢測照片是否來自前置攝像頭? 我嘗試了以下代碼,但沒有用:

     let availableCameraDevices = AVCaptureDevice.devicesWithMediaType(AVMediaTypeVideo)
                for device in availableCameraDevices as! [AVCaptureDevice] {
                    if device.position == .Back {
                        let reversedImage = UIImage(CGImage: image.CGImage!, scale: 1.0, orientation: .LeftMirrored)

                        sp.pickedPhoto = reversedImage

                    }
                    else if device.position == .Front {
                        sp.pickedPhoto = image


                    }
                }

您的代碼檢查設備上可用的攝像頭。 您需要做的是在拍攝照片讀取圖像的元數據,其中將包含相機信息。

使用此解決方案讀取圖像附帶的 Exif 數據以找出哪個相機獲取它: Exif Data from Image

在 Swift 中,你可以這樣做:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {

    self.dismissViewControllerAnimated(false, completion: { () -> Void in

    })

    if picker.cameraDevice == .Front
    {
        print("Image taken from front camera")
    }
    else if picker.cameraDevice == .Rear
    {
        print("Image taken from back camera")
    }
}

您可以在UIImagePicker回調中傳遞的信息字典中檢查圖像 EXIF 數據。

- (IBAction) handleTakePhoto:(UIButton *)sender {

    UIImagePickerController* picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [self presentViewController:picker animated:YES completion:nil];

}

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    __block NSDictionary* metadata = [info objectForKey:UIImagePickerControllerMediaMetadata];

    dispatch_async(dispatch_get_main_queue(), ^{

        NSLog(@"%@", [metadata valueForKeyPath:@"{Exif}.LensModel"]);

        [picker dismissViewControllerAnimated:YES completion:nil];

    });

}

上面的片段輸出

iPhone 6 Plus 后置攝像頭 4.15mm f/2.2

您將不得不解析字符串的“前”或“后”部分。

依賴於解析從字符串中解析出來的東西會引發一些危險信號——可能有更好、更穩定的方法來做這件事。

從圖像中提取 EXIF 數據

Facetime相機:

"{Exif}" =     {
        ColorSpace = 65535;
        PixelXDimension = 3088;
        PixelYDimension = 2320;
    };

主攝像頭:

"{Exif}" =     {
        ColorSpace = 65535;
        PixelXDimension = 4032;
        PixelYDimension = 3024;
    };

使用此助手提取 EXIF 數據

extension UIImage {

    func getExifData() -> CFDictionary? {
        var exifData: CFDictionary? = nil
        if let data = self.jpegData(compressionQuality: 1.0) {
            data.withUnsafeBytes {
                let bytes = $0.baseAddress?.assumingMemoryBound(to: UInt8.self)
                if let cfData = CFDataCreate(kCFAllocatorDefault, bytes, data.count),
                    let source = CGImageSourceCreateWithData(cfData, nil) {
                    exifData = CGImageSourceCopyPropertiesAtIndex(source, 0, nil)
                }
            }
        }
        return exifData
    }
}

來源: https ://stackoverflow.com/a/54230367/6576315

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM