2014-10-05 97 views
9

在iOS 8的,与新的PhotoKit,以创建新的图像的方法是用-[PHPhotoLibrary performChanges:completionHandler],以这种方式:元数据(EXIF,TIFF等)Photokit

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

然而,我不能找到有关如何在图像上设置元数据的任何文档。

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

PhotoKit中是否有等价的方法?

回答

8

通过使用临时文件可以达到相同的结果。例如:

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 
} 

我复制粘贴代码我的项目,希望我不是失去了一些东西。

+0

您遗漏了实际将数据保存到fileURL的代码;)另请注意,Camera应用程序将它们保存为JPG而非PNG。保存为PNG为我创建了一个4.5 MB的文件,而用相机拍摄时仅为850 KB。 – Joey 2016-11-27 06:38:24

+0

这将创建新的图像。你知道如何编辑现有的照片资产图像的元数据吗? – Ryuk 2017-05-18 10:52:30