【问题标题】:Can I get CGPath from image with alpha channel?我可以从带有 alpha 通道的图像中获取 CGPath 吗?
【发布时间】:2012-12-05 16:20:16
【问题描述】:

我设法使用与此处类似的方法屏蔽视图:How to mask UIViews in iOS 但现在我需要在这个蒙面视图中检测触摸。 Gesture recognisers 和按钮会检测到bounds 区域中的触摸,基本上忽略了掩码。所以我想如果我能从我的蒙版图像中得到CGPath,处理触摸会很容易。有关如何从蒙版图像中获取CGPath 的任何建议?

【问题讨论】:

    标签: iphone ios core-graphics calayer


    【解决方案1】:

    您可以设置UIGestureRecognizer 的委托并覆盖- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch

    1 .获取识别器视图中的触摸位置

    - (CGPoint)locationInView:(UIView *)view

    2 。找出该位置图像的 Alpha 通道。为此,请使用此代码(为了提高效率,您可以提前重新计算整个图像的透明值,并将它们存储到缓冲区中,这样您就不必每次都复制 alpha 缓冲区。我在这里保持简单并为单个像素完成。如果您想了解如何一次完成整个图像,请查看此post

    unsigned char pixelData[1] = {0};
    CGContextRef context = CGBitmapContextCreate(pixelData, 1, 1, 8, 1, NULL, kCGImageAlphaOnly);
    UIGraphicsPushContext(context);
    [im drawAtPoint:CGPointMake(-point.x, -point.y)];
    UIGraphicsPopContext();
    CGContextRelease(context);
    CGFloat alphaChannel = pixel[0]/255.0;
    BOOL transparent = alphaChannel < 0.01;
    
    1. 根据该值,返回 YES 或 NO

    【讨论】:

    • 非常感谢,现在我会坚持这种方法,但我还是很好奇我是否可以从 CGImageRef 获取 CGPath,所以如果我不标记你的答案,我希望你不介意刚刚被接受,只投票赞成。
    • 我不认为你可以开箱即用,除非你使用某种边缘提取算法。即便如此,我怀疑你的 CGPath 只是一个近似值。
    猜你喜欢
    • 1970-01-01
    • 2011-09-06
    • 2016-07-26
    • 1970-01-01
    • 2023-04-02
    • 2018-09-19
    • 1970-01-01
    • 2017-03-01
    • 2016-07-02
    相关资源
    最近更新 更多