将掩码转换为 NSData 时保留 UIImage 上的掩码

Preserving the mask on a UIImage when converting it to NSData

我正在使用 Parse 开发一个 iOS 应用程序,该应用程序要求个人资料图片为六边形。现在,我正在从 Parse 下载 PFFile,抓取该图像,然后用六边形遮盖它。这适用于像个人资料屏幕这样的简单视图(屏蔽只需要一次),但是当使用关注者的个人资料图像列表屏蔽集合视图时,该应用程序会遇到严重的性能问题。

在我看来,最好的解决方案是将已经正确屏蔽的个人资料图片上传到 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 转换为数据(此数据然后上传到 Parse)时,图像失去了它的掩码并且是再次广场。

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

我已经尝试了一些方法,但我猜这是由于我对如何进行遮罩以及它是否会影响底层图像的模糊理解所致。这是我用于屏蔽图像的参考:http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

将包含您的图像和蒙版的视图传递给此方法(我将其用作 UIImage 的扩展)

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

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

这将 return 您的 'flattened' 蒙版图像(确保 UIView 具有清晰的背景)

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