我目前正在用户拍照时抓取照片:
- (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 进行相机捕获的元数据到达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
从捕获。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)