如何屏蔽UIImageView

我试图掩盖一个像这样的图像:

在这里输入图像描述

我发现这个教程,但没有提到我可以findImage.pngmask.png

教程

你能帮我吗?

编辑

 - (void) viewDidLoad { UIImage *OrigImage = [UIImage imageNamed:@"dogs.png"]; UIImage *mask = [UIImage imageNamed:@"mask.png"]; UIImage *maskedImage = [self maskImage:OrigImage withMask:mask]; myUIIMage.image = maskedImage; } 

有一个更简单的方法。

 #import <QuartzCore/QuartzCore.h> // remember to include Framework as well CALayer *mask = [CALayer layer]; mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage]; mask.frame = CGRectMake(0, 0, <img_width>, <img_height>); yourImageView.layer.mask = mask; yourImageView.layer.masksToBounds = YES; 

本教程使用这个方法有两个参数: imagemaskImage ,当您调用方法时,您必须设置这些参数。 一个示例调用可能看起来像这样,假设该方法在同一个类中,并且图片在您的包中:

注意 – 令人惊讶的是,图像甚至不必是相同的大小。

 ... UIImage *image = [UIImage imageNamed:@"dogs.png"]; UIImage *mask = [UIImage imageNamed:@"mask.png"]; // result of the masking method UIImage *maskedImage = [self maskImage:image withMask:mask]; ... - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef maskedImageRef = CGImageCreateWithMask([image CGImage], mask); UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; CGImageRelease(mask); CGImageRelease(maskedImageRef); // returns new image with mask applied return maskedImage; } 

在你提供你的代码之后,我添加了一些数字作为注释,以供参考。 你还有两个select。 这整个事情是一个方法,你在哪里打电话。 您不需要在其中创build图像:这会将该方法的可重用性降至零。

为了让你的代码工作。 将方法头( 1. )更改为

 - (UIImage *)maskImageMyImages { 

然后改变2.中variables的名字

 UIImage *maskImage = [UIImage imageNamed:@"mask.png"]; 

该方法将返回您的蒙面图像,所以你必须在某个地方调用这个方法。 你能告诉我们你在哪里调用你的方法的代码?

我尝试使用CALayer或CGImageCreateWithMask这两个代码,但他们都没有为我工作

但我发现问题是与PNG文件格式,而不是代码!
所以只是为了分享我的发现!

如果你想使用

 - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage 

你必须使用24位 PNG 没有 alpha通道

如果你想使用CALayer掩码,你必须使用(24位或8位)png alpha通道你的PNG的透明部分将掩盖图像(平滑的渐变alpha蒙版..使用24位PNG alpha通道)

 - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGImageRef maskImageRef = [maskImage CGImage]; // create a bitmap graphics context the size of the image CGContextRef mainViewContentContext = CGBitmapContextCreate (NULL, maskImage.size.width, maskImage.size.height, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast); CGColorSpaceRelease(colorSpace); if (mainViewContentContext==NULL) return NULL; CGFloat ratio = 0; ratio = maskImage.size.width/ image.size.width; if(ratio * image.size.height < maskImage.size.height) { ratio = maskImage.size.height/ image.size.height; } CGRect rect1 = {{0, 0}, {maskImage.size.width, maskImage.size.height}}; CGRect rect2 = {{-((image.size.width*ratio)-maskImage.size.width)/2 , -((image.size.height*ratio)-maskImage.size.height)/2}, {image.size.width*ratio, image.size.height*ratio}}; CGContextClipToMask(mainViewContentContext, rect1, maskImageRef); CGContextDrawImage(mainViewContentContext, rect2, image.CGImage); // Create CGImageRef of the main view bitmap content, and then // release that bitmap context CGImageRef newImage = CGBitmapContextCreateImage(mainViewContentContext); CGContextRelease(mainViewContentContext); UIImage *theImage = [UIImage imageWithCGImage:newImage]; CGImageRelease(newImage); // return the image return theImage; } 

这对我有用。

SWIFT 3 XCODE 8.1

 func maskImage(image: UIImage, withMask maskImage: UIImage) -> UIImage { let maskRef = maskImage.cgImage let mask = CGImage( maskWidth: maskRef!.width, height: maskRef!.height, bitsPerComponent: maskRef!.bitsPerComponent, bitsPerPixel: maskRef!.bitsPerPixel, bytesPerRow: maskRef!.bytesPerRow, provider: maskRef!.dataProvider!, decode: nil, shouldInterpolate: false) let masked = image.cgImage!.masking(mask!) let maskedImage = UIImage(cgImage: masked!) // No need to release. Core Foundation objects are automatically memory managed. return maskedImage } 

// 用来

 testImage.image = maskImage(image: UIImage(named: "OriginalImage")!, withMask: UIImage(named: "maskImage")!) 

Swift版本的接受解决scheme:

 func maskImage(image: UIImage, withMask maskImage: UIImage) -> UIImage { let maskRef = maskImage.CGImage let mask = CGImageMaskCreate( CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), nil, false) let masked = CGImageCreateWithMask(image.CGImage, mask) let maskedImage = UIImage(CGImage: masked)! // No need to release. Core Foundation objects are automatically memory managed. return maskedImage } 

以防万一有人需要它。

它为我工作完美无瑕。

Swift 3 – 我find最简单的解决scheme

我为此创build了@IBDesignable ,以便您可以立即在故事板上看到效果。

 import UIKit @IBDesignable class UIImageViewWithMask: UIImageView { var maskImageView = UIImageView() @IBInspectable var maskImage: UIImage? { didSet { maskImageView.image = maskImage updateView() } } // This updates mask size when changing device orientation (portrait/landscape) override func layoutSubviews() { super.layoutSubviews() updateView() } func updateView() { if maskImageView.image != nil { maskImageView.frame = bounds mask = maskImageView } } } 

如何使用

  1. 创build一个新文件并粘贴在上面的代码中。
  2. 添加UIImageView到你的故事板(如果你想分配一个图像)。
  3. 在Identity Inspector上:将自定义类更改为“UIImageViewWithMask”(上面的自定义类名称)。
  4. 在属性检查器上:select要使用的掩膜图像。

在Storyboard上遮蔽

笔记

  • 您的蒙版图像应该有非黑色部分的透明背景(PNG)。

我们发现,正确的答案现在不能正常工作,并实现了很less的投入类,这有助于掩盖UIImageView中的任何图像。

它在这里可用: https : //github.com/Werbary/WBMaskedImageView

例:

 WBMaskedImageView *imgView = [[WBMaskedImageView alloc] initWithFrame:frame]; imgView.originalImage = [UIImage imageNamed:@"original_image.png"]; imgView.maskImage = [UIImage imageNamed:@"mask_image.png"];