【问题标题】:How to detect if photo taken from front camera如何检测是否从前置摄像头拍摄照片
【发布时间】:2021-06-22 00:30:13
【问题描述】:

我想使用以下代码垂直更改从前置摄像头拍摄的照片的方向:

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


                    }
                }

【问题讨论】:

标签: ios swift


【解决方案1】:

您的代码会检查设备上的可用摄像头。您需要做的是在拍摄照片之后读取图像的元数据,其中将包含相机信息。

使用此方案读取图片自带的Exif数据,找出是哪个相机获取的:Exif Data from Image

【讨论】:

    【解决方案2】:

    在 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")
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以在信息字典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];
      
          });
      
      }
      

      上面的sn-p输出

      iPhone 6 Plus 后置摄像头 4.15mm f/2.2

      您必须解析字符串的“前”或“后”部分。

      依靠解析从字符串中解析出来的内容会引发一些危险信号——可能有更好、更稳定的方法。

      【讨论】:

        【解决方案4】:

        从图片中提取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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-19
          • 2014-07-10
          • 2016-07-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多