你能否将UIImage的exif数据复制到缩放后的UIImage中?

3
我目前正在获取用户拍摄照片时的图片:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
   UIImage *image = info[UIImagePickerControllerOriginalImage];

   // create a jpeg
   NSData *jpegData = UIImageJPEGRepresentation(image, 1.0f);

   // write jpeg image to file in app space
   NSString *filePath = 

   // create file path in app space
   [imageData writeToFile:filePath atomically:NO];
}

这很好用,文件以jpeg格式创建,并且保留了其EXIF数据。

现在,我想把图片缩小一点,使它变得更小一些。但是我希望保留原始UIImage中存在的某些或所有EXIF数据,并将其复制到缩放后的图像中。

目前正在缩放图像:

UIImage *scaledImage = [renderer imageWithActions:^(UIGraphicsImageRendererContext*_Nonnull myContext) {
   [image drawInRect:(CGRect) {.origin = CGPointZero, .size = size}];
}];

这可以很好地创建一个缩放的图像,但它不包含任何EXIF数据。
有没有办法缩放图像并保留原始图像的EXIF数据?我能否从原始图像中获取EXIF数据并将其复制到缩放后的图像中?
此外,我已经搜索了许多使用“ALAssetsLibrary”的答案,但该库已被弃用。 看起来替代方案是“PhotoKit”。 它声明:
在iOS和macOS中,PhotoKit提供支持为Photos应用程序构建照片编辑扩展的类。 在iOS和tvOS中,PhotoKit还直接提供对由Photos应用程序管理的照片和视频资产的访问权限。
然而,我没有使用Photos应用程序,我的图像不来自本地照片库或iCloud,因为我只想将照片存储在我的私人应用空间中。

“我能否从原始图像中获取EXIF数据并将其复制到缩放后的图像中?” 是的,你可以使用ImageIO框架来做到这一点,并且已经在Stack Overflow上解释了很多次。尝试搜索此链接:https://stackoverflow.com/search?q=UIImage+metadata - matt
@matt 谢谢,看了你发的链接,里面都是未回答的问题。找不到一个能展示从UIImage中提取图像元数据并将其复制到另一个UIImage的例子。 - lostintranslation
不过,你可以找到从UIImage复制元数据和向UIImage复制元数据的方法,所以只需将它们组合起来即可。 - matt
没错,这就是拥有元数据的数据。而这些回答也让这一点变得非常清晰。 - matt
好的,我已经给出了明确的答案,尽管我真的应该将其标记为重复(因为现有答案中已经包含了所有需要的内容)。 - matt
显示剩余2条评论
1个回答

2

使用UIImagePickerController捕获相机的元数据可以在info字典中通过UIImagePickerControllerMediaMetadata键获取。您可以使用ImageIO框架将其复制到另一个UIImage的数据中(您需要import ImageIO)。我的代码是Swift,但它使用Objective-C Cocoa类和ImageIO C函数,因此您应该可以轻松地将其翻译成Objective-C:

最初的回答:

使用UIImagePickerController捕获的相机元数据可在info字典下的UIImagePickerControllerMediaMetadata键中找到。您可以使用ImageIO框架将其复制到另一个UIImage的数据中(需要import ImageIO)。我的代码是Swift,但它使用Objective-C Cocoa类和ImageIO C函数,因此您应该轻松地将其翻译为Objective-C。

let jpeg = im!.jpegData(compressionQuality:1) // im is the new UIImage
let src = CGImageSourceCreateWithData(jpeg as CFData, nil)!
let data = NSMutableData()
let uti = CGImageSourceGetType(src)!
let dest = CGImageDestinationCreateWithData(data as CFMutableData, uti, 1, nil)!
CGImageDestinationAddImageFromSource(dest, src, 0, m) // m is the metadata
CGImageDestinationFinalize(dest)

接下来,data是图像im的数据以及从捕获中得到的元数据m


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