Photokit 中的元数据(EXIF、TIFF 等)

Posted

技术标签:

【中文标题】Photokit 中的元数据(EXIF、TIFF 等)【英文标题】:Metadata (EXIF, TIFF, etc.) in Photokit 【发布时间】:2014-10-05 23:26:55 【问题描述】:

ios 8 中,使用新的 PhotoKit,创建新图像的方式是使用-[phphotoLibrary performChanges:completionHandler],这样:

[[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 中有没有等价的方法?

【问题讨论】:

【参考方案1】:

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

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

我正在从我的项目中复制粘贴代码,希望我没有遗漏什么。

【讨论】:

您已经省略了实际将数据保存到 fileURL 的代码;) 另请注意,相机应用程序将它们保存为 JPG 而不是 PNG。保存为 PNG 为我生成了一个 4.5 MB 的文件,而使用相机拍摄时只有 850 KB。 这将创建新图像。你知道如何编辑现有照片资产图像的元数据吗?

以上是关于Photokit 中的元数据(EXIF、TIFF 等)的主要内容,如果未能解决你的问题,请参考以下文章

EXIF.Js:读取图片的EXIF信息

BGRA 的 Tiff 或 Exif 标签

七牛:关于图片 EXIF 信息中旋转参数 Orientation 的理解

Android中读取图片EXIF元数据之metadata-extractor的使用

Exif.js读取图像的元数据

Exif.js 读取图像的元数据