我发现能够做到这一点的唯一方法是ALAssetsLibrary/writeImageDataToSavedPhotosAlbum:metadata:completionBlock:,但是,这个方法将图像保存到照片库中.相反,我想将图像保存到临时文件夹(例如,通过电子邮件分享,而不填充照片库).
我试过使用CGImageDestinationRef(CGImageDestinationAddImageFromSource),但它只能使用解码的图像创建,这意味着它在保存时进行重新编码(测试,像素字节看起来不同).
是否有任何其他可用于iOS的方法/类可以保存图像数据以及元数据,除了使用CGImageDestinationRef?对于解决方法的建议也将受到欢迎.
解决方法 这是iOS SDK的令人沮丧的问题.首先,我建议提交一份 enhancement request.现在,这是一个潜在的解决方法:如果ALAsset是由你创建的(即它的可编辑属性为YES),那么您可以基本上读取数据,使用元数据写入,再次读取,保存到磁盘,然后使用原始元数据.
这种方法将避免创建一个重复的图像.
请仔细阅读//注释,因为我略微省略了一些东西(如建立元数据字典):
ALAsset* asset; //get your asset,don't use this empty oneif (asset.editable) { // get the source data ALAssetRepresentation *rep = [asset defaultRepresentation]; Byte *buffer = (Byte*)malloc(rep.size); // add error checking here NSUInteger buffered = [rep getBytes:buffer fromOffset:0.0 length:rep.size error:nil]; NSData *sourceData = [NSData dataWithBytesNocopy:buffer length:buffered freeWhenDone:YES]; // make your Metadata whatever you want // you should use actual Metadata,not a blank dictionary NSDictionary *MetadataDictionary = [NSDictionary dictionary]; // these are __weak to avoID creating an ARC retain cycle NSData __weak *originalData = sourceData; NSDictionary __weak *originalMetadata = [rep Metadata]; [asset setimageData:sourceData Metadata:MetadataDictionary completionBlock:^(NSURL *assetURL,NSError *error) { //Now get your data and write it to file if (!error) { //get your data... Nsstring *assetPath = [assetURL path]; NSData *targetData = [[NSfileManager defaultManager] contentsAtPath:assetPath]; //...write to file... NSArray *searchPaths = NSSearchPathForDirectorIEsInDomains(NSdocumentDirectory,NSUserDomainMask,YES); Nsstring *documentPath = [searchPaths lastObject]; NSURL *fileURL = [NSURL fileURLWithPath:documentPath]; [targetData writetoURL:fileURL atomically:YES]; //...and put it back the way it was [asset setimageData:originalData Metadata:originalMetadata completionBlock:nil]; } else { // handle error on setting data NSLog(@"ERROR: %@",[error localizedDescription]); } }];} else { // you'll need to make a new ALAsset which you have permission to edit and then try again}
如您所见,如果ALAsset不属于您,您将需要创建一个照片到用户的库,这正是你想要避免的.但是,您可能已经猜到了,即使您的应用创建了ALAsset,您也无法从用户的照片库中删除ALAsset. (随意提出另一个增强请求.)
所以,如果照片/图像是在您的应用程序中创建的,这将适用于您.
但是如果没有,它将创建一个用户必须删除的附加副本.
唯一的选择是自己解析NSData,这将是一个痛苦.我不知道在iOS SDK中填补这个空白的开源库.
总结以上是内存溢出为你收集整理的在iOS上保存修改后的元数据(无需重新编码)的原始图像数据全部内容,希望文章能够帮你解决在iOS上保存修改后的元数据(无需重新编码)的原始图像数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)