lufei's Studio.

关于遮罩(mask)

字数统计: 584阅读时长: 2 min
2019/11/26 Share

遮罩(Mask),就是一幅只有单通道,肉眼看上去只有黑白,和黑白之间颜色的图片,通过可透过光和不可透过光,来遮挡下面的图片,达到不同的效果,可以理解为四通道图片中的alpha通道,所以也可以叫alpha图。

遮罩图中,直观肉眼看上去,0代表黑色,255代表白色。

遮罩图和被遮罩图融合一般情况都是作为前景图,在这种情况下:

遮罩图在和被遮罩图融合的时候,0代表透明度为0,也就是完全透明,1代表不透明,肉眼看上去,就是白色部分透明,黑色的部分不透明。融合的话,可以使用CGBitmapContextCreate拿到遮罩图和被遮罩图的像素数组,自己组合计算,也可以利用CGImageCreateWithMask,直接利用系统api帮助你合成。

甚至可以用CGContext来为自己合成,类似这样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);

[tintColor setFill];

CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height);

UIRectFill(bounds);

[self drawInRect:bounds blendMode:blendMode alpha:1.0f];

if (blendMode != kCGBlendModeDestinationIn) {
[self drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0f];
}

UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

遮罩图作为背景图来融合另一张图的时候,和作为前景图融合是相反的,也就是黑是透明,白是不透明,这种情况比较少见。

在iOS中,CALayer,处理maskcontents属性的时候,肉眼直观显示,黑色代表可透过光,白色不可透光。

所以,在一张肉眼可见的黑白的alpha单通道图上,透明和不透明,是通过白色和黑色来处理的,这就为我们的画板增加了想像的空间,也就是说:

在遮罩图上,没有透明色(clearColor), 只有白,黑,及黑白之间的颜色

事实上单纯的单通道alpha图,看上去是黑白的,但是我们使用他是为了遮挡和显示被遮罩图的,所以,为了在显示的时候,能够直观的看到效果,CGImageMaskCreate是一个重要的api, 可以把”看上去黑白”的遮罩图,转为可以在iOS中使用的遮罩图。

这一块的东西比较绕,所以我写个博客记录一下,便于以后弄晕了,再来看看QAQ

测试demo

CATALOG