如何在iOS中修改图像元数据(EXIF)而不需要复制?

4

目前我使用的代码可以写入更新后的元数据,但会创建重复图像。以下是代码:

if( [self.textView.text length] != 0 && ![self.userComments isEqualToString: self.textView.text])
        {
            // This code works but creates a duplicate image
            NSMutableDictionary *userCommentDictionary = [NSMutableDictionary dictionary];
            [userCommentDictionary setValue:self.textView.text forKey:(NSString *)kCGImagePropertyExifUserComment];

            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            [dict setValue:userCommentDictionary forKey:(NSString *)kCGImagePropertyExifDictionary];

            ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];

            [al writeImageToSavedPhotosAlbum:[self.imageView.image CGImage]
                                metadata:dict
                         completionBlock:^(NSURL *assetURL, NSError *error) {
                             if (error == nil) {
                                 NSLog(@"Image saved.");
                                 self.userComments = self.textView.text;
                             } else {
                                 NSLog(@"Error saving image.");
                             }
                         }];
        }

有没有什么方法可以避免重复?谢谢您的时间。

2
我不相信这是可能的。AssetsLibrary根本不允许修改原始资产,所有内容都保存为具有对原始资产的引用的新资产。使用新的PhotoKit库可以实现,但我在那里也没有看到任何允许您修改元数据的内容。 - Jack
1
@JackWu 没错。请添加为答案。 - Léo Natan
@JackWu,同意。请将其放在答案形式中,以便其他人遇到此问题时可以查看(否则,如果有人采用您的评论并在下面的框中进行改述,则一半的赏金将归该人!) - username tbd
谢谢大家,答案已发布 :] - Jack
1个回答

7
正如评论中所述,我认为这是不可能的。
AssetsLibrary 根本不允许修改原始资产,所有内容都保存为新资产,并引用原始资产。
在 iOS 8 中,使用新的 PhotoKit 库可以修改资产,但我没有看到任何有助于修改元数据的东西。
浏览 ImageIO,有一些方法可以修改元数据,但同样没有任何方法将其保存到照片库中。然而,你可以用具有修改后 exif 数据的另一个文件替换磁盘上的文件。
根据这里的答案,ALAssets 提供了一个不指向磁盘的 URL。我相信这意味着你无法获取实际的图像 URL 来覆盖它,尽管不在照片库中。
如果这很重要,我建议你将其作为一个增强功能提交给 Apple ,如果有许多人请求同样的东西,他们可能会在未来添加它!不过他们似乎不想让人们乱搞这些东西…

谢谢你的回答。ImageIO能让我替换原始图像吗?能得到一个明确的答案就太好了。 - userx
@AbhishekMukherjee 我编辑了一下以便更详细地阐述。我认为不行,你无法修改现有照片库图像的元数据。 - Jack
我认为PhotoKit允许您编辑原始图像的元数据。以下是Apple Docs的一些文本:“您可以使用照片库对象对照片对象进行更改,例如编辑资产元数据或内容,插入新资产或重新排列集合成员。” - userx
当我说它不允许时,你可以相信我。他们所谓的“元数据”是指诸如dateCreatedlocationisFavoriteisHidden之类的东西。实际上就是这些。你可以深入了解API并自行查看。 - Jack
哦,我以为元数据会包括图像的所有元数据。谢谢你提供的信息。 - userx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接