我正在通过PhotoKit编辑照片,但我发现这不会保留原始照片的元数据.即使Apple应用Sepia或Chrome过滤器时提供的SamplePhotosApp也会出现这种情况.我的问题是,您如何确保保留所有原始照片元数据?
我已经发现了如何获取原始图像的元数据,并且我能够将这些元数据保存到我创建的最终CIImage中,但是在提交编辑时它仍然被删除.我将CIImage转换为CGImage到UIImage转换为NSData的方式一定存在问题,或者我是如何将它写入磁盘的.
asset.requestContentEditingInputWithOptions(options) { (input: PHContentEditingInput!,_) -> Void in //Get full image let url = input.fullSizeImageURL let orientation = self.input.fullSizeImageOrientation var inputImage = CIImage(contentsOfURL: url) inputImage = inputImage.imageByApplyingOrientation(orientation) //do some processing on original photo here and create a CGImage... //save the original photo's metadata to a new CIImage: let originalMetadata = inputImage.properties() let newImage = CIImage(CGImage: editedCGImage,options: [kCIImageProperties: originalMetadata]) println(newImage.properties()) //correctly prints all metadata! //commit changes to disk - somewhere after this line the metadata is lost let eaglContext = EAGLContext(API: .OpenGLES2) let ciContext = CIContext(EAGLContext: eaglContext) let outputImageRef = ciContext.createCGImage(newImage,fromRect: newImage.extent()) let uiImage = UIImage(CGImage: outputImageRef,scale: 1.0,orientation: UIImageOrientation.Up) let jpegNSData = UIImageJPEGRepresentation(uiImage,0.75) let contentEditingOutput = PHContentEditingOutput(contentEditingInput: input) let success = jpegData.writeToURL(contentEditingOutput.renderedContentURL,options: NSDataWritingOptions.AtomicWrite,error: _) PHPhotoLibrary.sharedPhotoLibrary().performChanges({ () -> Void in let request = PHAssetChangeRequest(forAsset: asset) request.contentEditingOutput = contentEditingOutput },completionHandler: { (success: Bool,error: NSError!) -> Void in if success == false { println('failed to commit image edit: \(error)') } }) })
原始 – 请注意GPS标签:
编辑照片后:
解决方法
根据CIImage.properties的Apple文档:
If the CIImage object is the output of a filter (or filter chain),this method returns the metadata from the filter’s original input image.
话虽如此,如果文档不正确,我就会这样做.
您需要自己保存属性.为此,您需要将URL的内容作为NSData读取
NSURL *url = @"http://somewebsite.com/path/to/some/image.jpg"; NSData *imageData = [NSData dataWithContentsOfURL:url]; CIImage *image = [CIImage imageWithData:imageData]; // Save off the properties CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef) imageData); NSDictionary* metadata = (__bridge NSDictionary *) CGImageSourceCopyProperties(imageSource,NULL); // process your image // ... NSData *outputData = // create data from altered image. // Save the image CGImageSourceRef outputImageSource = CGImageSourceCreateWithData((__bridge CFDataRef) outputData); CFMutableDataRef jpegData = CFDataCreateMutable(NULL,0); CGImageDestinationRef outputDestination = CGImageDestinationCreateWithData(jpegData,CGImageSourceGetType(outputImageSource),1,NULL); // add the image data to the destination CGImageDestinationAddImageFromSource(jpegData,outputImageSource,(__bridge CFDictionaryRef) 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."); }
如果您不需要修改元数据,则无需将CFDataRef强制转换为NSDictionary *,但我这样做只是为了完整性.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。