使用 Swift (iOS) 和 Photos 框架保存自定义图像的元数据
Posted
技术标签:
【中文标题】使用 Swift (iOS) 和 Photos 框架保存自定义图像的元数据【英文标题】:Save metadata for custom image with Swift (iOS) and Photos framework 【发布时间】:2016-02-21 06:08:01 【问题描述】:我正在尝试将元数据添加到我的综合生成中,并使用 Photos 框架将其保存到相机胶卷中。我得到了保存和编辑工作,但我似乎可以弄清楚如何添加元数据。我尝试了许多方法,例如通过创建 CoreGraphics 图像添加元数据(参见下面的代码)。所有这些方法都不会给我一个错误,但是当我在我的 Mac 上打开图像时,我看不到元数据。
任何人都可以在这里指出正确的方向吗?
phphotoLibrary.sharedPhotoLibrary().performChanges(
let assets : PHFetchResult = PHAsset.fetchAssetsWithLocalIdentifiers([self.localIdentifier], options: nil);
let asset : PHAsset = assets[0] as! PHAsset;
let changeRequest = PHAssetChangeRequest(forAsset: asset);
changeRequest.location = self.currentLocation;
asset.requestContentEditingInputWithOptions(nil, completionHandler: (input: PHContentEditingInput?,
info: [NSObject : AnyObject]) -> Void in
guard let input = input else return
let imageManager : PHImageManager = PHImageManager();
let requestoptions : PHImageRequestOptions = PHImageRequestOptions();
requestoptions.resizeMode = PHImageRequestOptionsResizeMode.None;
imageManager.requestImageForAsset(asset, targetSize: PHImageManagerMaximumSize, contentMode: PHImageContentMode.Default, options: PHImageRequestOptions(), resultHandler: (let image : UIImage?, _) -> Void in
let output : PHContentEditingOutput = PHContentEditingOutput(contentEditingInput: input);
PHPhotoLibrary.sharedPhotoLibrary().performChanges( () -> Void in
let changeRequest = PHAssetChangeRequest(forAsset: asset);
/* Neu */
let imageData : NSData = NSData(contentsOfURL: (input.fullSizeImageURL)!)!;
let image : CIImage = CIImage(data: imageData)!;
let dataPtr = CFDataCreate(kCFAllocatorDefault, UnsafePointer<UInt8>(imageData.bytes), imageData.length)
// Save off the properties
let imageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!;
var metadata : NSMutableDictionary = NSMutableDictionary(dictionary: CGImageSourceCopyProperties(imageSource, nil)!);
/* Add some values to metadata */
....
NSLog("New metadata: %@", metadata);
// Save the image
let outputImageSource : CGImageSourceRef = CGImageSourceCreateWithData(dataPtr, nil)!;
let jpegData : CFMutableDataRef = CFDataCreateMutable(kCFAllocatorDefault, 0);
let outputDestination : CGImageDestinationRef = CGImageDestinationCreateWithData(jpegData, CGImageSourceGetType(outputImageSource)!, 1, nil)!;
// add the image data to the destination
CGImageDestinationAddImageFromSource(outputDestination, outputImageSource, 0, metadata);
if CGImageDestinationFinalize(outputDestination)
NSLog("Successful image creation.");
// process the image rendering, adjustment data creation and finalize the asset edit.
else
NSLog("Image creation failed.");
(jpegData as NSData).writeToURL(output.renderedContentURL, atomically: true);
let options : String = NSString(format: "%f|%f|%f|%f|%f|%f", self.saturationSlider.value, self.warmthSlider.value, self.brightnessSlider.value, self.sharpnessSlider.value, self.contrastSlider.value, self.gammaSlider.value ) as String;
let nsObject: AnyObject? = NSBundle.mainBundle().infoDictionary!["CFBundleShortVersionString"];
output.adjustmentData = PHAdjustmentData(formatIdentifier: NSBundle.mainBundle().bundleIdentifier!,
formatVersion: nsObject as! String,
data: options.dataUsingEncoding(NSUTF8StringEncoding)!);
changeRequest.contentEditingOutput = output;
, completionHandler: (_bool, _error) -> Void in
if !_bool && error != nil
NSLog("%@", error!);
);
);
);
, completionHandler: (_bool, _error) -> Void in
);
【问题讨论】:
一年后在这里,但我发现了相同的结果。没有错误,但也没有自定义元数据。虽然 Photos 框架宣传资产的“编辑元数据”,但它显然不提供对实际 EXIF 类型元数据的编辑。 我遇到了同样的问题。我发布了我自己版本的这个问题***.com/questions/48255636/…。如果图像已经从另一个应用程序附加了 PHAdjustmentData,则编辑 exif 属性似乎有效。我最终放弃并在创建图像时向 exif 注释属性添加了一个 id,并使用它来索引一个字典,该字典存储了我存储在 Core Data 中的其他元数据。 【参考方案1】:您可以在creationRequest
对象上添加/设置一些属性。我不知道添加自定义元数据。
PHPhotoLibrary.shared().performChanges(
let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: self.anImage!)
let aLocation = CLLocation(latitude: 27.63866, longitude: -80.39707)
creationRequest.location = aLocation
creationRequest.isFavorite = true
creationRequest.creationDate = Date()
, completionHandler: success, error in
if !success
print("error creating asset: \(error!)")
else
print("success creating asset!")
)
【讨论】:
以上是关于使用 Swift (iOS) 和 Photos 框架保存自定义图像的元数据的主要内容,如果未能解决你的问题,请参考以下文章
text PHPhotoLibrary + SaveImage - 使用Photos Framework swift 3保存图像
尝试使用 Photos Framework [Swift 2.0] 从 imagepickercontroller 检索 NSURL
swift photos 获取相册所有图片 自定义多选附编号 自定义裁切
swift photos 获取相册所有图片 自定义多选附编号 自定义裁切