照片 framework.How 从所选图像中获取日期和位置

Photos framework.How to get date and location fromt the selected image

我有一个从库中加载的集合视图。所选图像显示在另一个 viewcontroller 中。我想从图像中获取 exif 数据(位置和日期)。我应该如何修改代码才能做到这一点?

页面列表图片代码如下所示:

import UIKit
import Photos
import MobileCoreServices
private let reuseIdentifier = "PhotoCell"
class AddPhotoViewController: UIViewController , UIImagePickerControllerDelegate ,UINavigationControllerDelegate ,UICollectionViewDataSource ,UICollectionViewDelegate{

    @IBOutlet weak var photoAlbum: UICollectionView!

    var TakenImage : UIImage?
    var newMedia: Bool?
    var selectedImage : UIImage!
    var pickedImage : UIImage!
    var assetCollection: PHAssetCollection!
    var photosAsset: PHFetchResult!
    var assetThumbnailSize: CGSize!
    let imagePicker: UIImagePickerController! = UIImagePickerController()
    var cameraon : Bool = false
    var index : [NSIndexPath]!

    var note : String!
    var tags = ""
    var noteAlreadyEntered = false
    override func viewDidLoad()
    {
        super.viewDidLoad()
        self.navigationController?.navigationBar.barTintColor = UIColor.grayColor()

        let collection:PHFetchResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: nil)

        var i = 0
        repeat
        {
            if (collection.count > 0)
            {
                if let first_Obj:AnyObject = collection.objectAtIndex(i)
                {
                    self.assetCollection = first_Obj as! PHAssetCollection
                }
                i += 1
            }
        }while( i < collection.count)



        // Do any additional setup after loading the view.
    }

    func takePhoto(sender : UIButton)
     {
        if (UIImagePickerController.isSourceTypeAvailable(.Camera))
        {
            if UIImagePickerController.availableCaptureModesForCameraDevice(.Rear) != nil {
                imagePicker.allowsEditing = false
                imagePicker.sourceType = .Camera
                imagePicker.cameraCaptureMode = .Photo
                presentViewController(imagePicker, animated: true, completion: {})
            } else {
                print("Rear camera doesn't exist Application cannot access the camera.")
            }
        } else {
            print("Camera inaccessable Application cannot access the camera.")
        }

     }
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
    {
        print("Got an image")
        if let pickedImage:UIImage = (info[UIImagePickerControllerOriginalImage]) as? UIImage {
            let selectorToCall = Selector("imageWasSavedSuccessfully:didFinishSavingWithError:context:")
            UIImageWriteToSavedPhotosAlbum(pickedImage, self, selectorToCall, nil)
            TakenImage = pickedImage
        }
        imagePicker.dismissViewControllerAnimated(true, completion: {
            // Anything you want to happen when the user saves an image
        })
    }

    func imagePickerControllerDidCancel(picker: UIImagePickerController)
    {
        print("User canceled image")
        dismissViewControllerAnimated(true, completion: {
            // Anything you want to happen when the user selects cancel
        })
    }


        override func viewWillAppear(animated: Bool)
    {
        if let layout = self.photoAlbum!.collectionViewLayout as? UICollectionViewFlowLayout{
            let cellSize = layout.itemSize

            self.assetThumbnailSize = CGSizeMake(cellSize.width, cellSize.height)
        }

        //fetch the photos from collection
        self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil)
        self.photoAlbum!.reloadData()


    }

    // MARK: UICollectionViewDelegate

    /*
    // Uncomment this method to specify if the specified item should be selected
    override func collectionView(collectionView: UICollectionView, shouldSelectItemAtIndexPath indexPath: NSIndexPath) -> Bool {
    return true
    }
    */


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
    {

           if (segue.identifier == "saveSelected")
        {


            let cell = sender as! PhotoAlbumCollectionViewCell
            let indexPath = photoAlbum.indexPathForCell(cell)
            let destVC = segue.destinationViewController as! NoteDetailViewController
            destVC.asset = self.photosAsset[indexPath!.item] as! PHAsset
            destVC.flag = true
            if(noteAlreadyEntered == true)
            {
                destVC.content = note
                if (self.tags != "")
                {
                    destVC.tagsTextField.text = self.tags
                }
            }

        }



    }

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
    {
        if (indexPath.row == 0)
        {
        let controller = self.storyboard!.instantiateViewControllerWithIdentifier("NoteDetailViewController") as! NoteDetailViewController
            controller.takinPhoto = true
            if(noteAlreadyEntered == true)
            {
                controller.content = note
                controller.imageView.image = TakenImage
                controller.tagsTextField.text = self.tags
            }
            else
            {
                controller.imageView2.image = TakenImage
                controller.tagsTextField.text = self.tags
            }



        self.navigationController!.pushViewController(controller, animated: true)
        }
    }


    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int
    {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        // #warning Incomplete implementation, return the number of items
        var count: Int = 0

        if(self.photosAsset != nil){
            count = self.photosAsset.count
        }
        print("\(self.photosAsset.count)")

        return count
    }
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
    {
        let cell: PhotoAlbumCollectionViewCell = photoAlbum.dequeueReusableCellWithReuseIdentifier("PhotoCell", forIndexPath: indexPath) as! PhotoAlbumCollectionViewCell
        if (indexPath.item == 0)
        {
           let btn = UIButton(frame: cell.contentView.bounds) //Set your frame that you want
        //    btn.setBackgroundImage(UIImage(named: "Compact Camera Filled-50.png"), forState: .Normal)
            btn.setImage(UIImage(named: "Compact Camera Filled-50.png"), forState: .Normal)
            btn.addTarget(self, action: "takePhoto:", forControlEvents: UIControlEvents.TouchUpInside)
            cell.contentView.addSubview(btn)

        }
        else
        {

        let asset: PHAsset = self.photosAsset[indexPath.item] as! PHAsset

        PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: self.assetThumbnailSize, contentMode: .AspectFill, options: nil, resultHandler: {(result, info)in
            if let image = result {
                cell.setThumbnailImage(image)
            }
        })
        }
        return cell
    }



    func collectionView(collectinView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
        return 4
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
        return 1
    }

    func collectionView(collectionView: UICollectionView, shouldShowMenuForItemAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }

    func collectionView(collectionView: UICollectionView, canPerformAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) -> Bool {
        return false
    }

    func collectionView(collectionView: UICollectionView, performAction action: Selector, forItemAtIndexPath indexPath: NSIndexPath, withSender sender: AnyObject?) {

        self.dismissViewControllerAnimated(false, completion: nil)

    }

}

一张照片是一个 PHAsset。 PHAsset 为您提供 properties 表示其元数据。

如果你想要 raw EXIF 元数据,你必须通过类似 CIImage 的东西。