ios - 从包含 CGImage 的 UIImage 对象获取 NSData

标签 ios objective-c uiimage nsdata cgimage

为了将图像文件上传到我的服务器,我需要获取它的 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/

相关文章:

ios - Iphone 启动画面永远不会消失

swift - 从 UIImage 获取 URL 路径 - Framework ImagePicker

ios - UIImagePickerController 裁剪图像高于用户选择

ios - 开始使用 UIDatePicker 时的 Action

objective-c - 尝试在其 View 不在窗口层次结构中的 * 上呈现 *

objective-c - 如何在 iOS Native 应用程序中应用主题

objective-c - #pragma clang 诊断的 Swift 替代方案

ios - UIImage 在 UITableViewCell 中调整过高

ios - 如何像在 Apple 的日历应用程序中那样在导航栏 (iOS 7) 中显示/隐藏搜索栏?

Iphone UIView 切换 : Previous view's subviews polluting newly switched-to view