为了将图像文件上传到我的服务器,我需要获取它的 NSData。我现在在执行此操作时遇到困难,因为我的 UIImage 包含 CGImage。
让我向您展示我是如何做事的。当用户拍照时,我对拍摄的照片执行以下操作:
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image = [[UIImage alloc]initWithData:imageData];
_subLayer = [CALayer layer];
image = [self selfieCorrection:image];
image = [self rotate:image andOrientation:image.imageOrientation];
CGRect cropRectFinal = CGRectMake(cropRect.origin.x, 140, cropRect.size.width, cropRect.size.height);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRectFinal);
_subLayer.contents = (id)[UIImage imageWithCGImage:imageRef].CGImage;
在上面的代码中,我创建了一个 UIImage,并使用 imageData
对象对其进行初始化。我还创建了一个名为 _subLayer
的图层对象,它将在屏幕上显示最终图像。然后旋转并校正图像的方向,然后设置 CGRect 来裁剪我想要保留的图像部分。
最重要的部分是最后两条语句。我使用原始 UIImage 创建一个名为 imageRef
的 CGImageRef。然后,在最后一条语句中,我将 _subLayer
的内容属性设置为等于我的最终图像。
在同一个 View Controller 中,在 IBAction 内部,我有以下语句,它可以帮助我将图像传递到下一个 View Controller :sendFriendsVC.finalPhotoToSend = _subLayer.contents;
finalPhotoToSend
是我在下一个 View Controller 的头文件中设置的属性,如下所示:
@property (nonatomic, retain) UIImage *finalPhotoToSend;
当我转到下一个 View Controller 时,数据已成功传递,但是当我 NSLog finalPhotoToSend
时,即使它是 UIImage,它也会像这样打印到控制台:
<CGImage 0x1563dac0>
为了将照片上传到我的后端服务器服务,它需要我使用 NSData 创建一个对象。我尝试使用这两种方法从 finalPhotoToSend
对象中获取 NSData:
NSData *imageData = UIImageJPEGRepresentation(finalPhotoToSend, 0.7);
和
NSData *imageData = UIImagePNGRepresentation(finalPhotoToSend);
但是这些总是在 xcode 中给我以下错误:
NSInvalidArgumentException', reason: '-[__NSCFType CGImage]: unrecognized selector sent to instance
我不知道该怎么办。由于从技术上讲它持有 CGImage,所以我应该使用不同的方法从 UIImage 中获取 NSData 吗?在将数据传递到下一个 View Controller 之前,我是否应该做一些不同的事情?
编辑迈克尔:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:self {
if ([segue.identifier isEqualToString:@"mediaCaptureToSendToFriendsSegue"]) {
SendToFriendsViewController *sendFriendsVC = segue.destinationViewController;
sendFriendsVC.finalPhotoToSend = _subLayer.contents;
}
}
最佳答案
我刚刚想通了。以下是我最终用于 IBAction 方法实现的内容:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:self {
if ([segue.identifier isEqualToString:@"mediaCaptureToSendToFriendsSegue"]) {
SendToFriendsViewController *sendFriendsVC = segue.destinationViewController;
UIImage* image2 = [UIImage imageWithCGImage:(__bridge CGImageRef)(_subLayer.contents)];
sendFriendsVC.finalPhotoToSend = image2;
}
}
我是 Objective-C 的新手,并不完全确定以下语句在做什么:
UIImage* image2 = [UIImage imageWithCGImage:(__bridge CGImageRef)(_subLayer.contents)];
但是 xcode 建议这样做并且它有效。现在在下一个 View Controller 上,finalPhotoToSend
对象 NSLogs 作为 UIImage 而不是 CGImage。
关于ios - 从包含 CGImage 的 UIImage 对象获取 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22134975/