let image_data = UIImageJPEGRepresentation(self.imagetoadd.image!,0.0)
ios中的图像,使用swift 3来执行此操作正在上传。我怎么能解决这个问题?
答案 0 :(得分:1)
JPEG图像通常包含一个EXIF字典,这里存储了很多关于图像拍摄方式的信息,图像旋转就是其中之一。
UIImage
个实例会在名为imageOrientation
的特定属性中保留这些信息(如果原始图像具有该信息)。
据我记得,这个信息是使用UIImageJPEGRepresentation
方法撕掉的
要使用上述信息创建正确的数据实例,必须使用Core Graphics方法,或在发送图像之前标准化旋转
为了规范化图像应该足够了:
CGImageRef cgRef = imageToSave.CGImage;
UIImage * fixImage = [[UIImage alloc] initWithCGImage:cgRef scale:imageToSave.scale orientation:UIImageOrientationUp];
保留轮换信息:
CFURLRef url = (__bridge_retained CFURLRef)[NSURL fileURLWithPath:path];//Save data path
NSDictionary * metadataDictionary = [self imageMetadataForPath:pathToOriginalImage];
CFMutableDictionaryRef metadataImage = (__bridge_retained CFMutableDictionaryRef) metadata;
CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL);
CGImageDestinationAddImage(destination, image, metadataImage);
if (!CGImageDestinationFinalize(destination)) {
DLog(@"Failed to write image to %@", path);
}
-imageMetadataForPath:
- (NSDictionary*) imageMetadataForPath:(NSString*) imagePath{
NSURL *imageURL = [NSURL fileURLWithPath:imagePath];
CGImageSourceRef mySourceRef = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, NULL);
NSDictionary * dict = (NSDictionary *) CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(mySourceRef,0,NULL));
CFRelease(mySourceRef);
return dict;
}
这是我的项目的复制和粘贴,您可能需要进行大量重构,也因为它在核心基础中使用手动内存管理而您正在使用SWIFT。当然,通过使用最后一组指令,后端代码也必须准备好处理图像方向。
如果您想了解有关轮换的更多信息,请参阅link。