在iOS上保存修改后的元数据(无需重新编码)的原始图像数据

前端之家收集整理的这篇文章主要介绍了在iOS上保存修改后的元数据(无需重新编码)的原始图像数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在temp文件夹中保存一些元数据更改的图像,而无需重新编码实际的图像数据.

我发现能够做到这一点的唯一方法ALAssetsLibrary/writeImageDataToSavedPhotosAlbum:metadata:completionBlock:,但是,这个方法将图像保存到照片库中.相反,我想将图像保存到临时文件夹(例如,通过电子邮件分享,而不填充照片库).

我试过使用CGImageDestinationRef(CGImageDestinationAddImageFromSource),但它只能使用解码的图像创建,这意味着它在保存时进行重新编码(测试,像素字节看起来不同).

是否有任何其他可用于iOS的方法/类可以保存图像数据以及元数据,除了使用CGImageDestinationRef?对于解决方法的建议也将受到欢迎.

解决方法

这是iOS SDK的令人沮丧的问题.首先,我建议提交一份 enhancement request.

现在,这是一个潜在的解决方法:如果ALAsset是由你创建的(即它的可编辑属性为YES),那么您可以基本上读取数据,使用元数据写入,再次读取,保存到磁盘,然后使用原始元数据.

这种方法将避免创建一个重复的图像.

请仔细阅读//注释,因为我略微省略了一些东西(如建立元数据字典):

ALAsset* asset; //get your asset,don't use this empty one
if (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相关文章