【问题标题】:iOS - Uploading image with EXIF intactiOS - 上传完整的 EXIF 图像
【发布时间】:2015-08-06 12:05:42
【问题描述】:

我在我的应用程序文档目录中保存了带有 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]; 

如何从 Documents 目录上传我的 .jpg 文件且其 EXIF 完好无损?

【问题讨论】:

  • 您怎么知道 (1) 图片文件在 Documents 目录中时有 EXIF 信息,以及 (2) 文件在上传后丢失了该信息?
  • (1) 我使用文件管理器访问了 Documents 目录并将图像复制了出来。然后使用EXIF工具在线查看图像EXIF。 (2) 再次从服务器下载上传的图片并使用EXIF工具,所有EXIF数据丢失。

标签: ios objective-c iphone xcode exif


【解决方案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 感谢您的解决方案,我尝试将 base64 编码的字符串发布到我的服务器,但上传的 jpg 似乎已损坏。如何发布 base64 编码的字符串?
  • 设法让图像上传工作。 EXIF 数据也是完整的。非常感谢!
  • 将 NSData 转换为 base64 有什么意义?它与 EXIF 有什么关系?
  • 您好!我知道这是一个老问题,但今天有人知道该怎么做吗?我今天用 Swift let rawDataImage = image.jpegData(compressionQuality: 1.0)!let base64String = rawDataImage.base64EncodedString(options: []) 做了同样的事情,但它没有用。我已经打印了 base64String 以将其复制/粘贴到我的 python 脚本中以转换和分析字符串,但大多数 EXIF 数据都丢失了,例如 GPS 信息等。我能够使用在线 base64 转换器验证我的 python 代码,所以问题必须在 Swift 代码中。
猜你喜欢
  • 2014-06-19
  • 2016-06-02
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-12
  • 1970-01-01
  • 2020-08-12
  • 2017-08-30
相关资源
最近更新 更多