如何在UIImage中'切割'透明孔?

Phi*_*lip 12 iphone cocoa-touch objective-c uiimage

我正试图在UIImage中剪切一个透明的方块,但老实说我不得不知道在哪里/如何开始.

任何帮助将不胜感激.

谢谢!

mat*_*att 19

假设您的图像正在视图中显示 - 可能是UIImageView.然后我们可以通过屏蔽视图的图层在该视图中打出一个矩形孔.每个视图都有一个图层.我们将向该视图的图层应用一个蒙版,它本身就是一个包含图像的图层,我们将在代码中生成该图层.除了中间某处的清晰矩形外,图像将为黑色.清晰的矩形将导致图像视图中的孔.

所以,让我们self.iv来看看这个UIImageView.尝试运行此代码:

CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
UIGraphicsBeginImageContextWithOptions(r.size, NO, 0);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddRect(c, r2);
CGContextAddRect(c, r);
CGContextEOClip(c);
CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
CGContextFillRect(c, r);
UIImage* maskim = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CALayer* mask = [CALayer layer];
mask.frame = r;
mask.contents = (id)maskim.CGImage;
self.iv.layer.mask = mask;
Run Code Online (Sandbox Code Playgroud)

例如,在此图像中,白色方块不是叠加的正方形,而是一个洞,显示其后面的窗口背景的白色:

在此输入图像描述

编辑:我觉得有义务,因为我在评论中提到它,以显示如何使用CAShapeLayer做同样的事情.结果完全一样:

CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
CAShapeLayer* lay = [CAShapeLayer layer];
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, r2);
CGPathAddRect(path, nil, r);
lay.path = path;
CGPathRelease(path);
lay.fillRule = kCAFillRuleEvenOdd;
self.iv.layer.mask = lay;
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 11

这是cut#hole#inView2017年复制和粘贴的简单Swift功能

func cut(hole: CGRect, inView v: UIView) {
    let p:CGMutablePath = CGMutablePath()
    p.addRect(inView.bounds)
    p.addRect(hole)

    let s = CAShapeLayer()
    s.path = p
    s.fillRule = kCAFillRuleEvenOdd

    v.layer.mask = s
}
Run Code Online (Sandbox Code Playgroud)