我正在尝试编写一种方法来检测两个UIImages碰撞时何时仅考虑非透明像素。为了清楚起见,一个方法在UIImageView上其alpha分量大于0的像素与另一个UIImageView上的alpha分量大于0的像素重叠时返回TRUE。
该方法应该是这样的:
- (void)checkCollisionBetweenImage:(UIImage *)img1 inFrame:(CGRect)frame1 andImage:(UIImage *)img2 inFrame:(CGRect)frame2;
所以它接收两个要检查的图像,其帧是独立传递的,因为坐标位置必须转换为匹配(UIImageView.frame不会这样做)。
[更新1] 我将使用我之前提出的问题中使用的一段代码进行更新,但此代码并不总是有效。我想问题在于使用的UIImages不一定在同一个超视图中。
Detect pixel collision/overlapping between two images
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 = malloc(canvasRect.size.width * canvasRect.size.height * 4 * bitsPerComponent);
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++)
{
int8_t alpha = rawData[byteIndex + 3];
if (alpha > 64)
{
NSLog(@"collided in byte: %d", i);
free(rawData);
return YES;
}
byteIndex += 4;
}
free(rawData);
return NO;
[更新2] 在绘制蒙面图像之前,我使用了另一条据称需要的线。
CGContextSetBlendMode(context, kCGBlendModeCopy);
仍然无效。奇怪的是,我一直在检查碰撞时检测到的alpha值,它们是随机数。这很奇怪,因为我使用的图像只有完全不透明或完全透明,两者之间没有任何东西。
答案 0 :(得分:0)
检查实际的帧交叉点 - &gt;给你一个矩形。 检查矩形中的一个图像中的每个像素是否为alpha> 0.如果是,则将当前坐标转换为另一个图像,然后如果该像素的alpha> 0你有一个打击。重复,直到矩形完成。 如果你的命中率很高,请提前停止。
答案 1 :(得分:0)
Hrmm ...你的问题是你的图像背后有白色方块而你不想让白框发生碰撞,但你想让它们内部的图像发生碰撞?好... 我不认为你可以根据颜色检查碰撞。您需要做的是下载一些图像编辑软件(如gimp)并裁剪出白色背景。