我有两个包含具有某些透明区域的图像的UIImageView。有什么方法可以检查两幅图像之间的非透明区域是否碰撞?检测两个图像之间的像素碰撞/重叠
谢谢。
[更新] 所以这是我到现在为止,不幸的是它仍然无法正常工作,但我无法弄清楚为什么。
if (!CGRectIntersectsRect(frame1, frame2)) return NO;
NSLog(@"OverlapsPixelsInImage:withImage:> Images Intersect");
UIImage *img1 = imgView1.image;
UIImage *img2 = imgView2.image;
CGImageRef imgRef1 = [img1 CGImage];
CGImageRef imgRef2 = [img2 CGImage];
float minx = MIN(frame1.origin.x, frame2.origin.x);
float miny = MIN(frame1.origin.y, frame2.origin.y);
float maxx = MAX(frame1.origin.x + frame1.size.width, frame2.origin.x + frame2.size.width);
float maxy = MAX(frame1.origin.y + frame1.size.height, frame2.origin.y + frame2.size.height);
CGRect canvasRect = CGRectMake(0, 0, maxx - minx, maxy - miny);
size_t width = floorf(canvasRect.size.width);
size_t height = floorf(canvasRect.size.height);
NSUInteger bitsPerComponent = 8;
NSUInteger bytesPerRow = 4 * width;
unsigned char *rawData = calloc(width * height, sizeof(*rawData));
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
CGContextTranslateCTM(context, 0, canvasRect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextClipToMask(context, CGRectMake(frame2.origin.x - minx, frame2.origin.y - miny, frame2.size.width, frame2.size.height), imgRef2);
CGContextDrawImage(context, CGRectMake(frame1.origin.x - minx, frame1.origin.y - miny, frame1.size.width, frame1.size.height), imgRef1);
CGContextRelease(context);
int byteIndex = 0;
for (int i = 0; i < width * height; i++)
{
CGFloat alpha = rawData[byteIndex + 3];
if (alpha > 128)
{
NSLog(@"collided in byte: %d", i);
free(rawData);
return YES;
}
byteIndex += 4;
}
free(rawData);
return NO;
我不明白这个算法是如何检测碰撞的。很明显,如果我在kCGImageAlphaOnly上下文中绘制两张图像,我会发现透明和不透明的像素,因此寻找透明像素不会起作用。 – jglievano
你是对的。我不相信你可以很容易地在这里合并图像来找到重叠(我正在寻找透明度)。尽管如此,@ logancautrell的方法应该可以正常工作。使用参考示例创建两个位图数组,然后将它们分别寻找'X> 0 && Y> 0'。 –
也许你的方法也适用。你可以绘制一张图片来掩盖另一张图片。那么如果有任何不透明的像素,那就意味着有碰撞。 – jglievano