gpt4 book ai didi

iphone - 如何将 exif 元数据写入图像(不是相机胶卷,只是 UIImage 或 JPEG)

转载 作者:IT王子 更新时间:2023-10-29 07:51:41 25 4
gpt4 key购买 nike

我知道如何使用 ALAssets 保存元数据。但是,我想保存图像,或将其上传到某个地方,并且 exif 完好无损。我将 exif 数据作为 NSDictionary。但是我怎样才能将它正确地注入(inject)到 UIImage(或者可能是 NSData JPEG 表示)中呢?

最佳答案

我正在使用 UIImagePickerController 从相机获取图像,我的流程与 Chiquis 所描述的略有不同。在这里:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
UIImage *image = info[@"UIImagePickerControllerOriginalImage"];
NSString *fullPhotoFilename = ...; // generate the photo name and path here
NSData *photoData = [UIImage taggedImageData:image.jpegData metadata:info[@"UIImagePickerControllerMediaMetadata"] orientation:image.imageOrientation];
[photoData writeToFile:fullPhotoFilename atomically:YES];
}

并使用 UIImage 类别将图像数据与其元数据结合起来:

#import <ImageIO/ImageIO.h>
#import "UIImage+Tagging.h"
#import "LocationHelper.h"

@implementation UIImage (Tagging)

+ (NSData *)writeMetadataIntoImageData:(NSData *)imageData metadata:(NSMutableDictionary *)metadata {
// create an imagesourceref
CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef) imageData, NULL);

// this is the type of image (e.g., public.jpeg)
CFStringRef UTI = CGImageSourceGetType(source);

// create a new data object and write the new image into it
NSMutableData *dest_data = [NSMutableData data];
CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)dest_data, UTI, 1, NULL);
if (!destination) {
NSLog(@"Error: Could not create image destination");
}
// add the image contained in the image source to the destination, overidding the old metadata with our modified metadata
CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef) metadata);
BOOL success = NO;
success = CGImageDestinationFinalize(destination);
if (!success) {
NSLog(@"Error: Could not create data from image destination");
}
CFRelease(destination);
CFRelease(source);
return dest_data;
}

+ (NSData *)taggedImageData:(NSData *)imageData metadata:(NSDictionary *)metadata orientation:(UIImageOrientation)orientation {
CLLocationManager *locationManager = [CLLocationManager new];
CLLocation *location = [locationManager location];
NSMutableDictionary *newMetadata = [NSMutableDictionary dictionaryWithDictionary:metadata];
if (!newMetadata[(NSString *)kCGImagePropertyGPSDictionary] && location) {
newMetadata[(NSString *)kCGImagePropertyGPSDictionary] = [LocationHelper gpsDictionaryForLocation:location];
}

// Reference: http://sylvana.net/jpegcrop/exif_orientation.html
int newOrientation;
switch (orientation) {
case UIImageOrientationUp:
newOrientation = 1;
break;

case UIImageOrientationDown:
newOrientation = 3;
break;

case UIImageOrientationLeft:
newOrientation = 8;
break;

case UIImageOrientationRight:
newOrientation = 6;
break;

case UIImageOrientationUpMirrored:
newOrientation = 2;
break;

case UIImageOrientationDownMirrored:
newOrientation = 4;
break;

case UIImageOrientationLeftMirrored:
newOrientation = 5;
break;

case UIImageOrientationRightMirrored:
newOrientation = 7;
break;

default:
newOrientation = -1;
}
if (newOrientation != -1) {
newMetadata[(NSString *)kCGImagePropertyOrientation] = @(newOrientation);
}
NSData *newImageData = [self writeMetadataIntoImageData:imageData metadata:newMetadata];
return newImageData;
}

最后,这是我用来生成所需 GPS 字典的方法:

+ (NSDictionary *)gpsDictionaryForLocation:(CLLocation *)location {
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:timeZone];
[formatter setDateFormat:@"HH:mm:ss.SS"];

NSDictionary *gpsDict = @{(NSString *)kCGImagePropertyGPSLatitude: @(fabs(location.coordinate.latitude)),
(NSString *)kCGImagePropertyGPSLatitudeRef: ((location.coordinate.latitude >= 0) ? @"N" : @"S"),
(NSString *)kCGImagePropertyGPSLongitude: @(fabs(location.coordinate.longitude)),
(NSString *)kCGImagePropertyGPSLongitudeRef: ((location.coordinate.longitude >= 0) ? @"E" : @"W"),
(NSString *)kCGImagePropertyGPSTimeStamp: [formatter stringFromDate:[location timestamp]],
(NSString *)kCGImagePropertyGPSAltitude: @(fabs(location.altitude)),
};
return gpsDict;
}

希望对大家有帮助。感谢 Gustavo Ambrozio、Chiquis 和其他几个 SO 成员,我能够将它拼凑起来并在我的项目中使用它。

关于iphone - 如何将 exif 元数据写入图像(不是相机胶卷,只是 UIImage 或 JPEG),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9006759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com