【问题标题】:CGPath from image来自图像的 CGPath
【发布时间】:2011-12-08 16:00:32
【问题描述】:

我需要根据图像(任何可能的形状)创建蒙版。我需要:

  1. 使用 CGPath 作为适当的掩码创建 CALayer
  2. 调用[UIView.layer setMask: with layer above]

所以主要的大问题是如何设置基于黑白图像的CGPath?或者是否可以从图像中直接放置遮罩?

谢谢!


面具的示例图像:

【问题讨论】:

    标签: cocoa-touch uiview calayer mask cgpath


    【解决方案1】:

    您需要使用 Alpha 通道创建图像。根据CALayer的掩码属性文档:

    一个可选层,它的 alpha 通道用作蒙版来选择 图层背景与合成结果之间 图层的内容及其过滤背景。

    因此,您要用作蒙版的图层需要一个 Alpha 通道。如果要使用图像创建这样的通道,则图像本身需要具有 alpha 通道。因此,您需要将上面发布的黑白蒙版复制到图像的 Alpha 通道中。该特定图像的颜色被忽略。然后加载图像,为其设置图层内容并将该图层用作不同的图层蒙版。周围的东西:

    UIImage* imageWithAlphaChannel = [UIImage imageNamed:@"alpha.png"]; // Won't work with jpg
    CGImageRef cgImageWithAlpha = [imageWithAlphaChannel CGImage];
    CALayer* maskingLayer = [CALayer layer];
    maskingLayer.contents = (id)cgImageWithAlpha;
    
    //Assume viewToBeMasked is the view, who's layer needs to be masked
    CALayer* layerToBeMasked = viewToBeMasked.layer;
    layerToBeMasked.mask = maskingLayer;
    maskingLayer.frame = layerToBeMasked.bounds;
    //Alternativly use: viewToBeMasked.layer.mask = maskingLayer;
    

    在浏览器中编码,请原谅系统性错误。

    将所有遮罩存储为 png 文件可能会使您的应用程序变大。您可以将遮罩存储为 jpg,并在运行时使用 CoreGraphics 绘图函数创建适当的 alpha 版本。但这是另一个问题.....

    【讨论】:

    • 太棒了,伙计!我还有一个问题要问你。如何做最后一步,将 UIView 的图层设置为 layerToBeMasked。设置 [view.layer addSublayer:layerToBeMasked] 不起作用。我试图做 layerToBeMasked = view.layer 但也没有工作。我应该做一些额外的事情来让它工作吗?谢谢!
    • 这里不需要设置任何子层。您将设置图层的遮罩属性。我已经更新了上面的代码以更好地反映这一点。
    • 不知何故对我不起作用。我必须设置一个 maskingLayers 的框架,现在可以了。再次感谢!
    • 是的,你是对的。您需要设置框架。我忘记了。更新了上面的代码。
    【解决方案2】:

    我认为与我不久前做过的事情非常相似。基本上,您需要从 Adob​​e Illustrator 中导出文件,然后运行一个例程将该文件转换为 CGPath。

    你会在我对这个问题的回答中找到如何做到这一点:

    How to detect/handle touch events on curved regions?

    【讨论】:

    • 当您说蒙版时,您的意思是“图像的黑白版本”吗?
    • 是的。我将自己创建这些图像,以便可以以任何方式对其进行描述。基本上我想做的是 [view.layer setMask: CALayer contains image or CALayer with path built from image ] 。可以理解吗?
    • 啊,好吧,我想我开始明白了。恐怕您需要手动执行此操作。基本上将遮罩层添加为要遮罩的视图的子层。您的蒙版当然会适当地设置 alpha,以便蒙版图像在适当的地方可见。
    • 抱歉打扰了,但我不明白。那么我可以将图像设置为蒙版吗?你是什​​么意思“手动做”?将每个形状描述为一堆点...?我不能只说“嘿,把这张图片当作蒙版图案”?
    • 只是为了确定 - 图像不应该被屏蔽。 UIView 应该。在图像的黑色像素上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多