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

2023-12-06

我目前正在用户拍照时抓取照片:

- (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];
}

这非常有效,该文件被创建为带有 EXIF 数据的 jpeg 格式。

现在我想将图像缩小一点,使其变小一点。不过,我想保留原始 UIImage 中存在的部分或全部 EXIF 数据,并将其复制到缩放图像中。

当前缩放图像:

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

这会很好地创建缩放图像,但它不包含任何 EXIF 数据。

有没有办法缩放图像并保留原始图像的 EXIF 数据?我可以从原始图像中获取 EXIF 数据并将其复制到缩放后的图像中吗?

我还使用搜索了很多答案ALAssetsLibrary现在已弃用。似乎替代方案是PhotoKit。其中指出:

在 iOS 和 macOS 中,PhotoKit 提供了支持构建的类 照片应用程序的照片编辑扩展。在 iOS 和 tvOS 中,PhotoKit 还提供对由以下人员管理的照片和视频资源的直接访问 照片应用程序。

但是我没有使用“照片”应用程序,我的图像不是来自本地照片库或 icloud,因为我只想将照片存储在我的私人应用程序空间中。


使用 UIImagePickerController 进行相机捕获的元数据到达infoUIImagePickerControllerMediaMetadata 键下的字典。可以使用 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从捕获。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

你能将 UIImage exif 数据复制到缩放后的 UIImage 中吗? 的相关文章

随机推荐