Iphone 检测两幅图像之间的像素碰撞/重叠

Iphone 检测两幅图像之间的像素碰撞/重叠,iphone,ios,uiimageview,transparency,collision-detection,Iphone,Ios,Uiimageview,Transparency,Collision Detection,我有两个UIImageView,其中包含一些透明区域的图像。有没有办法检查两幅图像之间的不透明区域是否发生碰撞 谢谢 [更新] 这就是我到目前为止所拥有的,不幸的是它仍然不起作用,但我不知道为什么 if (!CGRectIntersectsRect(frame1, frame2)) return NO; NSLog(@"OverlapsPixelsInImage:withImage:> Images Intersect"); UIImage *img1 = imgView1.image;

我有两个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;
if(!CGRectIntersectsRect(frame1,frame2))返回否;
NSLog(@“重叠像素图像:与图像:>图像相交”);
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);
尺寸宽度=地板(画布尺寸宽度);
尺寸高度=地板(画布尺寸高度);
NSU整数比特分量=8;
NSUInteger bytesPerRow=4*宽度;
无符号字符*rawData=calloc(宽度*高度,sizeof(*rawData));
CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
CGContextRef context=CGBitmapContextCreate(原始数据、宽度、高度、bitsPerComponent、bytesPerRow、颜色空间、KCGimageAlphaPremultipledLast);
CGCOLORSPACTERELEASE(色彩空间);
CGContextTranslateCm(上下文,0,canvasRect.size.height);
CGContextScaleCTM(上下文,1.0,-1.0);
CGContextClipToMask(上下文,CGRectMake(frame2.origin.x-minx,frame2.origin.y-miny,frame2.size.width,frame2.size.height),imgRef2);
CGContextDrawImage(上下文,CGRectMake(frame1.origin.x-minx,frame1.origin.y-miny,frame1.size.width,frame1.size.height),imgRef1);
CGContextRelease(上下文);
int byteIndex=0;
对于(int i=0;i128)
{
NSLog(@“在字节%d中发生冲突”,i);
免费(原始数据);
返回YES;
}
byteIndex+=4;
}
免费(原始数据);
返回否;

不容易,您基本上必须读取原始位图数据并遍历像素。

您可以将两个图像的两个alpha通道绘制到一个位图上下文中,然后在数据中查找任何透明像素。查看中的
cliprectotpath()
code。这是在解决一个不同的问题,但方法是一样的。与其使用
CGContextFillPath()
绘制上下文,不如绘制两幅图像

以下是流程:

  • 创建仅alpha位图上下文(
    KCGIMAGEALPHONLY
  • 把你想比较的东西都画进去
  • 遍历像素,查看值。在我的示例中,它认为
    <128
    是“透明的”。如果希望完全透明,请使用
    ==0
  • 当你找到一个透明的像素时,这个例子只是记下它在哪一列。在您的问题中,您可能只返回
    YES
    ,或者您可能使用该数据形成另一个掩码

  • 我还不明白这个算法是如何检测碰撞的。很明显,如果我在kCGImageAlphaOnly上下文中绘制这两个图像,我会找到透明和非透明像素,因此查找透明像素不会起作用。你是对的。我不相信你可以很容易地在这里合并图像以找到重叠(我一直在寻找透明度)@不过,洛甘考雷尔的方法应该是正确的。使用参考示例创建两个位图数组,然后遍历它们,查找
    X>0&&Y>0
    。也许您的方法也适用。可以绘制一个图像来遮罩另一个图像。如果有任何不透明的像素,那就意味着有碰撞。我一直在脑子里想这个问题,你应该是对的。我总是要玩一玩这些东西,然后把它们画在纸上,让它们在我的脑海里保持清晰。