将UIImage上的蒙版转换为NSData时保留蒙版

问题描述:

我正在使用需要个人档案图片为六边形形状的Parse的iOS应用程序。现在,我正在从Parse下载PFFile,抓取该图像,然后用六角形掩盖。这适用于简档视图,例如个人资料屏幕(屏蔽只需要一次),但是当使用一系列关注者的个人资料图像屏蔽集合视图时,该应用会遭受严重的性能问题。将UIImage上的蒙版转换为NSData时保留蒙版

在我看来,最好的解决方案是将配置文件图片上传到已正确屏蔽的Parse,因此我所要做的就是将其拉下并显示出来。下面是我用来做这在我的注册视图控制器代码:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 

[picker dismissViewControllerAnimated:YES completion:nil]; 

UIImage *chosenPicture = info[UIImagePickerControllerEditedImage]; 

[EVNUtility maskImage:chosenPicture withMask:[UIImage imageNamed:@"MaskImage"] withCompletionBlock:^(UIImage *maskedImage) { 

    self.profileImageView.image = maskedImage; 
    self.pictureData = UIImagePNGRepresentation(maskedImage); 

}]; 

} 

拍摄的图像回到正确地从我的实用功能屏蔽掉,但是当我使用UIImagePNGRepresentation(或JPG等同)的UIImage的转换数据(这些数据然后上传到解析),图像失去其掩码并再次呈正方形。

如何在将UIImage转换为NSData时保留遮罩?

我已经尝试了几件事,但我猜这是由于我对如何完成遮罩以及是否影响底层图像的模糊理解。下面是我用于掩盖我的形象参考:http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

+0

您的示例代码存在问题。 'newImage'从哪里来的?你确定你传递正确的图像到'UIImagePNGRepresentation()'?在你的代码中,你不是。另外,在你的'EVNUtility'类方法中发生实际屏蔽的事实掩盖了这个例子。我认为向我们展示您用来执行遮罩的代码会更好。否则,任何答案只是一个猜测(并假定你正确掩盖)。 –

+0

@ToddDitchendorf说,'newImage'是一个错字和剩余的代码,我正在写代码来试验另一个解决方案。我编辑了我原来的问题。 'EVNUtility'中的代码是从我在问题结尾发布的链接中复制的; 'profileImageView'正确显示图像,所以我知道当我将其转换为NSData时蒙版已丢失。 – U2Pride15

传中包含您的形象和口罩,这种方法的观点(我用这个作为的UIImage的扩展)

+ (UIImage *) imageWithView:(UIView *)view 
{ 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); 
    [view.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return img; 
} 

这将返回你的“ (确保UIView具有清晰的背景)

然后,您将在创建PFFile之前转换为PNG(而不是JPG),这将保留透明度。

+0

工程就像一个魅力!在我将UIImage转换为NSData时,我在哪里可以了解为什么我丢失了蒙版?这对我来说真的不清楚。 – U2Pride15

+0

您的屏蔽UIImage只在运行时被屏蔽 - 即原始图像位于内存中,但有指令要使用掩码显示。我的方法将可见视图重新抽样为新图像。 – Halpo