【问题标题】:Preserving the mask on a UIImage when converting it to NSData将其转换为 NSData 时保留 UIImage 上的掩码
【发布时间】:2015-07-01 14:16:48
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您的示例代码有问题。 newImage 是从哪里来的?您确定将正确的图像传递给UIImagePNGRepresentation() 吗?在您上面的代码中,您不是。此外,实际屏蔽发生在您的 EVNUtility 类方法中的事实使这个示例有点模糊。我认为最好向我们展示您用于执行屏蔽的代码。否则,任何答案都只是猜测(并假设您正确屏蔽)。
  • @ToddDitchendorf newImage 是一个错字,是我为试验另一种解决方案而编写的代码的遗留问题。我已经编辑了我原来的问题。 “EVNUtility”中的代码是从我在问题末尾发布的链接中复制的; 'profileImageView' 正确显示图像,所以我知道将掩码转换为 NSData 时会丢失。

标签: ios objective-c parse-platform uiimage masking


【解决方案1】:

将包含您的图像和掩码的视图传递给此方法(我将其用作 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),这将保持透明度。

【讨论】:

  • 像魅力一样工作!在将 UIImage 转换为 NSData 时,我在哪里可以了解为什么我丢失了掩码?这对我来说真的不清楚。
  • 您拥有的蒙版 UIImage 仅在运行时被蒙版 - 即原始图像在内存中,但有使用蒙版显示的指令。我的方法将可见视图重新采样为新图像。
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 2010-12-21
  • 2013-11-29
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多