ios – 在将uiview捕获到uiimage时,掩码不起作用

前端之家收集整理的这篇文章主要介绍了ios – 在将uiview捕获到uiimage时,掩码不起作用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个UIView,我想保存为UI Image.我使用UIGraphicsBeginImageContext这样做,它可以正常工作.但是当我对(view / layer.mask)中的图像应用蒙版时,我通过UIGraphicsBeginImageContext捕获的图像是错误的(运行应用程序时屏蔽是正常的,但是当尝试从UIView获取UIImage时).有人遇到类似的问题吗?

解决方法

如果我理解正确,您希望从UIView层创建一个UIImage,而该层被屏蔽.我假设你想让目标UIImage拥有透明的背景.

我没有遇到任何实施这个问题,我有一个演示项目,你可以看看:

https://bitbucket.org/reydan/so_imagemask

您首先需要按面罩按钮.它将从束中加载掩码图像(黑色和白色),并将其设置为上面的UIView容器的图层蒙版.

然后,您可以按下将UIView容器转换为UIImage的复制图像按钮,然后将其设置为下面的目标图像视图,以查看结果.

我也会在这里发布两种方法

  1. - (IBAction)onMask:(id)sender {
  2.  
  3. UIImage* maskImage = [UIImage imageNamed:@"star.png"];
  4. UIImageView* maskImageView = [[UIImageView alloc] initWithImage:maskImage];
  5. maskImageView.contentMode = UIViewContentModeScaleAspectFit;
  6. maskImageView.frame = _mainContainerView.bounds;
  7.  
  8. _mainContainerView.layer.mask = maskImageView.layer;
  9. }
  10.  
  11. - (IBAction)onCopyImage:(id)sender {
  12.  
  13. UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size,FALSE,[[UIScreen mainScreen] scale]);
  14. [_mainContainerView.layer renderInContext:UIGraphicsGetCurrentContext()];
  15. UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
  16. UIGraphicsEndImageContext();
  17.  
  18. _destImageView.image = img;
  19. }

编辑

显然renderInContext:在IOS6上不使用掩码(因为它也在这里说SO).
我的解决办法是手动将蒙版应用于图像.掩码是从该层的掩码属性获取的,并且在上下文中渲染,因此我们对transformations / contentModes / etc没有任何问题.

这是更新的源代码(它也可在bitbucket上获得):

  1. - (IBAction)onCopyImage:(id)sender {
  2.  
  3. // Get the image from the mainImageView
  4. UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size,[[UIScreen mainScreen] scale]);
  5. [_mainContainerView.layer renderInContext:UIGraphicsGetCurrentContext()];
  6. UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
  7. UIGraphicsEndImageContext();
  8.  
  9.  
  10. // Use the next block if targeting IOS6
  11. {
  12. // Manually create a mask image (taken from the mask layer)
  13. UIGraphicsBeginImageContextWithOptions(_mainContainerView.bounds.size,TRUE,[[UIScreen mainScreen] scale]);
  14.  
  15. CGContextRef ctx = UIGraphicsGetCurrentContext();
  16. CGContextSetFillColorWithColor(ctx,[UIColor whiteColor].CGColor);
  17. CGContextFillRect(ctx,_mainContainerView.bounds);
  18.  
  19. [_mainContainerView.layer.mask renderInContext:ctx];
  20. UIImage * maskimg = UIGraphicsGetImageFromCurrentImageContext();
  21. UIGraphicsEndImageContext();
  22.  
  23.  
  24. // Create a image mask from the UIImage
  25. CGImageRef maskRef = maskimg.CGImage;
  26. CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvider(maskRef),NULL,false);
  27.  
  28. // Apply the mask to our source image
  29. CGImageRef maskedimg= CGImageCreateWithMask(img.CGImage,mask);
  30.  
  31. // Convert to UIImage so we can easily display it in a UIImageView
  32. img = [UIImage imageWithCGImage:maskedimg scale:img.scale orientation:img.imageOrientation];
  33.  
  34. CGImageRelease(mask);
  35. CGImageRelease(maskedimg);
  36. }
  37.  
  38.  
  39.  
  40. _destImageView.image = img;
  41.  
  42. }

编辑请检查bitbucket上的最新项目,因为它包含最新版本.

猜你在找的iOS相关文章