Objective c Photokit中的元数据(EXIF、TIFF等)
在iOS 8中,使用新的PhotoKit,创建新映像的方法是使用Objective c Photokit中的元数据(EXIF、TIFF等),objective-c,ios8,metadata,exif,photokit,Objective C,Ios8,Metadata,Exif,Photokit,在iOS 8中,使用新的PhotoKit,创建新映像的方法是使用-[PHPhotoLibrary performChanges:completionHandler],方法如下: [[PHPhotoLibrary sharedPhotoLibrary]性能更改:^{ PHAssetChangeRequest*changeRequest=[PHAssetChangeRequest creationRequestForAssetFromImage:image]; //如何设置元数据? }complet
-[PHPhotoLibrary performChanges:completionHandler]
,方法如下:
[[PHPhotoLibrary sharedPhotoLibrary]性能更改:^{
PHAssetChangeRequest*changeRequest=[PHAssetChangeRequest creationRequestForAssetFromImage:image];
//如何设置元数据?
}completionHandler:^(布尔成功,N错误*错误){
如果(成功)
{
//做事
}
}];
但是,我找不到任何关于如何在图像上设置元数据的文档
在旧的ALAssetLibrary中(它仍然有效,并且可能仍然是前进的“正确”方式),您只需使用-[ALAssetLibrary WritePhotosSavedPhotosAlbum:metadata:completionBlock:
,它允许您传入元数据字典
PhotoKit中是否有等效的方法?使用临时文件可以获得相同的结果。例如:
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)")
})
我正在复制项目中的粘贴代码,希望我没有遗漏任何内容。您遗漏了实际将数据保存到fileURL的代码;)还请注意,相机应用程序将它们保存为JPG而不是PNG。保存为PNG为我生成了一个4.5 MB的文件,而使用相机拍摄时只有850 KB。这将创建新图像。您知道如何编辑现有照片资源图像的元数据吗?
// 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
}