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

这很好用,文件是用其 ​​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,因为我只想将照片存储在我的私人应用程序空间中。

4

1 回答 1

2

使用 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

于 2019-03-01T15:27:22.353 回答