本文介绍了Photokit中的元数据(EXIF,TIFF等)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在iOS 8中,使用新的PhotoKit,创建新图像的方法是使用 - [PHPhotoLibrary performChanges:completionHandler] ,这样:

In iOS 8, with the new PhotoKit, the way to create a new image is with -[PHPhotoLibrary performChanges:completionHandler], in this way:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
    // TODO set metadata?
} completionHandler:^(BOOL success, NSError *error) {
    if(success)
    {
        // do stuff
    }
}];

但是,我找不到任何关于如何在图像上设置元数据的文档。

However, I can't find any documentation on how to set metadata on the image.

在旧的ALAssetLibrary中(它仍然有效,可能仍然是'正确的'前进方式),你只需使用 - [ALAssetLibrary writePhotoToSavedPhotosAlbum:metadata :completionBlock:] ,它允许您传入元数据字典。

In the old ALAssetLibrary (which still works, and may still be the 'correct' way going forward), you would just use -[ALAssetLibrary writePhotoToSavedPhotosAlbum:metadata:completionBlock:], which allows you to pass in a metadata dictionary.

PhotoKit中是否有等效的方法?

Is there an equivalent method in PhotoKit?

推荐答案

使用临时文件可以获得相同的结果。例如:

You can achieve the same result by using a temporary file. For example:

import Photos
import ImageIO
import MobileCoreServices

PHPhotoLibrary.sharedPhotoLibrary().performChanges ({
    let temporaryPath = ... // a path in the App's documents or cache directory
    let fileURL = NSURL.fileURLWithPath (temporaryPath)!

    // custom UIImagePNGRepresentation function is implemented below
    let PNGdataWithMetadata = UIImagePNGRepresentation (photo, copyright: "Image Copyright",
                author: "Image Author", description: "Image Description")
    let createAssetRequest = PHAssetChangeRequest.creationRequestForAssetFromImageAtFileURL (fileURL)
}, completionHandler: { (success, error) in
       // to-do: delete the temporary file            
        println ("completion \(success) \(error)")
})







// what the custom UIImagePNGRepresentation function does is create a PNG representation that contains the given metadata. The function assumes all functions return valid data
// to add the metadata to the PNG representation of the image we:
// 1. create the PNG representation and read the default values (these will include things like the image's size)
// 2. add the metadata items (see CGImageProperties Reference for the valid keys)
// 3. create an image destination where the new PNG will be created and assigned the metadata dictionary 

public func UIImagePNGRepresentation (image : UIImage, # copyright : String, # author : String, # description : String) -> NSData {
    // wrap the valid metadata values in a dictionary
    var PNGmetadata = [String : AnyObject] ()
    PNGmetadata [kCGImagePropertyPNGCopyright] = copyright
    PNGmetadata [kCGImagePropertyPNGAuthor] = author
    PNGmetadata [kCGImagePropertyPNGDescription] = description

    let metadata = [kCGImagePropertyPNGDictionary as String : PNGmetadata]
    return UIImagePNGRepresentation (image, metadata: metadata)
}

public func UIImagePNGRepresentation (image : UIImage, # metadata : [String : [String : AnyObject]]) -> NSData {
    let imageSource = CGImageSourceCreateWithData (UIImagePNGRepresentation (image), nil)
    let defaultAttributes = CGImageSourceCopyPropertiesAtIndex (imageSource, 0, nil) as NSDictionary
    let extendedAttributes = defaultAttributes.mutableCopy () as NSMutableDictionary

    for item in metadata {
        extendedAttributes [item.0] = item.1
    }

    var outputPNGdata = NSMutableData ()
    let imageDestination = CGImageDestinationCreateWithData (outputPNGdata, kUTTypePNG, 1, nil)
    CGImageDestinationAddImageFromSource (imageDestination, imageSource, 0, extendedAttributes)
    let success = CGImageDestinationFinalize (imageDestination)
    assert (success, "Fail!")

    return outputPNGdata
}

我正在复制粘贴来自我的项目的代码,希望我不会错过任何东西。

I'm copying-pasting code from my project, hopefully I'm not missing something.

这篇关于Photokit中的元数据(EXIF,TIFF等)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-17 07:19