使用CALayer和UIImage在Swift中对图像进行遮罩

5

我正在使用Swift编程。我想使用CALayer和UIImage掩盖图像。我正在通过编程方式创建我的掩膜图像。当我单独查看掩膜图像时,它可以正常工作。但是当我将其用作掩膜时,整个屏幕变成了白色。我怀疑问题在于配置CALayer对象。感谢您的帮助!

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        var maskImageSize = CGSizeMake(self.imageView.frame.width, self.imageView.frame.height)
        UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0)

        var color = UIColor(white: 1.0, alpha: 1.0)
        color.setFill()
        var rect = CGRectMake(0, 0, self.imageView.frame.width, self.imageView.frame.height)
        UIRectFill(rect)

        color = UIColor(white: 0.0, alpha: 1.0)
        color.setFill()
        rect = CGRectMake((self.imageView.frame.width/2)-100, (self.imageView.frame.height/2)-100, 200, 200)
        UIRectFill(rect)

        var maskImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        var maskLayer = CALayer()
        maskLayer.contents = maskImage
        maskLayer.contentsRect = CGRectMake(0, 0, self.imageView.bounds.width, self.imageView.bounds.height)


        self.imageView.image = UIImage(named: "pictobemasked.png")

        self.imageView.layer.mask = maskLayer;
    }

}
1个回答

13
抱歉,您的问题表述不太清楚 - 您并没有说明您实际上在尝试做什么!不过看起来,您可能正在尝试使用遮罩在图像视图中打一个矩形洞。如果是这样,那么您的代码至少有三个巨大的缺陷。
其中一个原因是您的代码无法工作的原因是,遮罩基于透明度而不是颜色。您正在使用不透明的白色和不透明的黑色,它们都是不透明的,所以在这里没有任何区别。您需要让您的两种颜色像这样:
 var color = UIColor(white: 1.0, alpha: 1.0)
// ... and then, later ...
color = UIColor(white: 1.0, alpha: 0.0)
第二个问题是您的层没有大小。您需要为其指定一个大小:
  • var maskLayer = CALayer()
    maskLayer.frame = CGRectMake(
        0, 0, self.imageView.bounds.width, self.imageView.bounds.height)
    
    第三个也是最大的问题是你的蒙版图像从未进入到你的蒙版层,因为你忘记提取它的CGImage
  • maskLayer.contents = maskImage.CGImage
    

    最后那个是最重要的,因为如果您将contents设置为UIImage而没有提取其CGImage,则图像会静默地失败并且无法进入图层。没有错误消息、没有崩溃-也没有图像。

    在您的代码中进行这三个更正之后,我能够让遮罩在图像中打一个矩形孔。所以如果这是您的目的,这些更改将实现它。


    感谢您提供书籍章节的链接。我承认我需要先彻底学习一下。我几乎已经来不及了,这就是为什么我开始进行黑客攻击的原因。我的问题是我不知道如何将掩模对齐到原始图像上。我想显示任意大小的图像。我通过编程生成掩模的内容,使其与图像大小相同。这个掩模中间的洞只是一个测试。在我让它运行之后,我想要一个更复杂的掩模,需要覆盖整个图像。我会非常感激任何帮助我正确对齐的建议。谢谢! - user2732722
    这确实需要成为一个新问题! - matt
    我在这里发布了一个新问题:http://stackoverflow.com/questions/27714562/how-to-align-a-mask-onto-an-image。感谢你的帮助。 - user2732722
    我已经完成了上述操作,而且它还有效。然而我想要一个圆。使用UIBezierPath绘制圆很容易,但是UIRectFill(..)和bezier对象.fill()之间有所不同。区别在于,使用完全透明的颜色的.fill()不会绘制任何内容。相当于隐形墨水!因此,请记住使用CGContextSetBlendMode(UIGraphicsGetCurrentContext(),.Copy)来表示您要像素对像素一样替换底部内容。 - specimen
    我想表达的是,fillWithBlendMode 会为你调用 CGContextSetBlendMode,所以你永远不需要获取当前的图形上下文 - 你可以使用 UIBezierPath(和 UIColor)完成整个过程。 - matt
    显示剩余5条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接