iOS - 上传带有完整EXIF信息的图片

5

我在应用程序的文档目录中保存了一些带有EXIF数据的.jpg格式图片。我的问题是,每当我尝试将.jpg文件转换成NSData以便通过HTTP POST上传时,上传的图片会丢失所有的EXIF数据。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *imagePath = [documentsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@",imageName]];
NSData *jpegImageData = [NSData dataWithContentsOfFile:imagePath]; 

如何在保留EXIF的情况下从文档目录上传我的 .jpg 文件?


你是如何确切地知道以下两点的呢?(1)当图像文件在文档目录中时,它具有EXIF信息。(2)上传后该文件已经丢失了这些信息。 - matt
(1) 我使用文件管理器访问了“文档”目录并将图像复制出来。然后使用在线EXIF工具查看图像的EXIF。 (2) 从服务器重新下载上传的图像并在其上使用EXIF工具时,所有EXIF数据都丢失了。 - Alfred
1个回答

1
为了保留jpg文件的EXIF元数据,我采用了以下解决方案:
- (void)uploadImage:(NSString *)imagePath {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        // Repair upload data
        UIImage *image = [UIImage imageNamed:imagePath];

        NSData *rawDataImage = UIImageJPEGRepresentation(image, 1.0f);

        NSString *base64EncodedString = @"";
        if ([rawDataImage respondsToSelector:@selector(base64EncodedStringWithOptions:)])
        {
            base64EncodedString = [rawDataImage base64EncodedStringWithOptions:0];
        }
        else
        {
            base64EncodedString = [rawDataImage base64Encoding];
        }

        NSString *uploadBody = [NSString stringWithFormat:@"{\"imageData\": \"%@\"}", base64EncodedString];

        // Post uploadBody to server
        NSString *serverUrl = @"Your_server";

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:serverUrl]];

        [request addValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

        NSString *msgLength = [NSString stringWithFormat:@"%lu", uploadBody.length];
        [request addValue:msgLength forHTTPHeaderField:@"Content-Length"];

        [request setHTTPMethod:@"POST"];
        [request setHTTPBody:[uploadBody dataUsingEncoding:NSUTF8StringEncoding]];

        [NSURLConnection connectionWithRequest:request delegate:<your_delegate OR nil>];
    });
}

希望这能为你提供帮助。

@Andrea:是的,这个解决方案可以完美地保留您的EXIF数据。我已经实践过了。 - phuongle
@phuongle 感谢您的解决方案,我尝试将base64编码的字符串发布到我的服务器,但上传的jpg似乎已损坏。我该如何发布base64编码的字符串? - Alfred
成功让图片上传工作了,EXIF数据也完好无损。非常感谢! - Alfred
将NSData转换为base64的意义是什么?这与EXIF有什么关系? - vahotm
大家好!我知道这是一个老问题,但有人知道如何在今天做吗?我今天用Swift做了同样的事情 let rawDataImage = image.jpegData(compressionQuality: 1.0)!let base64String = rawDataImage.base64EncodedString(options: []) 但它没有起作用。我已经打印了base64String以将其复制/粘贴到我的Python脚本中进行转换和分析,但大部分EXIF数据都丢失了,例如GPS信息等。我能够使用在线base64转换器验证我的Python代码,因此问题必须在Swift代码中。 - user3191334

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