我能否从带有透明通道的图像中获取CGPath?

4

我成功地使用了与此处类似的方法屏蔽了视图:如何在iOS中屏蔽UIView,但现在我需要检测这个被屏蔽的视图上的触摸。手势识别器和按钮会在边界区域内检测到触摸,基本上忽略掉了遮罩。因此,我认为如果能从我的遮罩图像获取CGPath,那么处理触摸就很容易了。有关如何从遮罩图像中获取CGPath的任何建议?

1个回答

2
你可以设置 UIGestureRecognizer 的代理并覆盖 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 方法。
1. 获取手势识别器视图中触摸点的位置。 - (CGPoint)locationInView:(UIView *)view 2. 找出该位置图像的 alpha 通道。为此,请使用以下代码(为了效率,您可以提前重新计算整个图像的透明度值,并将它们存储到缓冲区中,这样您就不必每次复制 alpha 缓冲区。我在这里保持简单,仅针对单个像素进行操作。如果您想了解如何同时处理整个图像,请参阅此帖子)。
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
非常感谢,目前我会坚持这种方法,但我仍然很好奇是否可以从CGImageRef中获取CGPath,所以希望您不介意我暂时不标记您的答案为已接受,只投票支持它。 - dariaa
我认为你不能直接实现,除非你使用某种边缘提取算法。即使这样,我怀疑你的CGPath也只能是一个近似值。 - mprivat

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