如何检测UIImage的非透明部分何时与UIImage的另一个非透明部分接触

时间:2014-03-31 20:35:56

标签: ios objective-c uiimageview uiimage

我无法完成我认为会更容易的事情。我试图在UIImage中的图片的非透明部分触摸UIImage中包含的图像的另一个非透明部分时运行方法。我举了一个例子来帮助我进一步解释我的问题。

A visual example of my problem

正如您在上图所示,我有两个三角形都在UIImage中。三角形都是PNG图片。只有三角形可见,因为背景已变得透明。两个UIImages都在UIImageView中。我希望能够在三角形的可见部分接触另一个三角形的可见部分时运行方法。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

此问题的强力解决方案是为每个图像创建bool s的2D数组,其中每个数组条目true表示不透明像素,false表示透明像素。如果CGRectIntersectsRect返回true(表示可能发生冲突),则代码扫描两个数组(根据相对位置具有适当的偏移)以检查实际的冲突。这变得复杂,并且计算密集。

蛮力方法的一种替代方法是使用OpenGLES来完成所有工作。这仍然是一个强力解决方案,但它将工作卸载到GPU,这在这些事情上要好得多。我不是OpenGLES的专家,所以我会把细节留给别人。

第二种选择是对问题施加限制,使其更容易解决。例如,给定两个三角形A和B,只有当A的一个顶点包含在B的区域内,或者如果B的一个顶点在A中时,才会发生冲突。可以使用UIBezierPath类解决此问题在目标C中。 UIBezierPath可用于创建三角形的路径。然后可以使用UIBezierPath的containsPoint:方法来检查相对三角形的顶点是否包含在目标三角形的区域中。

总之,解决方案是向每个对象添加UIBezierPath属性。初始化UIBezierPath以近似对象的形状。如果CGRectIntersectsRect指示可能的冲突,则使用containsPoint:方法检查一个对象的顶点是否包含在另一个对象的区域中。

答案 1 :(得分:1)

我做的是:

  • 计算图像A中的非alpha像素数量
  • 为图像B做了同样的事情
  • 将A + B图像合并为一个图像:C
  • 比较了结果像素数

如果合并后像素数量减少,那么我们就会受到影响。

if(C.count< A.count + B.count) - >我们有一个热门

+ (int)countPoints:(UIImage *)img
{

    CGImageRef cgImage = img.CGImage;
    NSUInteger width = img.size.width;
    NSUInteger height = img.size.height;
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    size_t bitsPerComponent = 8;
    size_t bytesPerPixel    = 1;
    size_t bytesPerRow      = width * bitsPerComponent * bytesPerPixel;
    size_t dataSize         = bytesPerRow * height;

    unsigned char *bitmapData = malloc(dataSize);
    memset(bitmapData, 0, dataSize);

    CGContextRef bitmap = CGBitmapContextCreate(bitmapData, width, height, bitsPerComponent, width, NULL,(CGBitmapInfo)kCGImageAlphaOnly);

    CGColorSpaceRelease(colorSpace);

    CGContextTranslateCTM(bitmap, 0, img.size.height);
    CGContextScaleCTM(bitmap, 1.0, -1.0);

    CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), cgImage);

    int p = 0;
    int i = 0;
    while (i < width * height) {

        if (bitmapData[i] > 0) {
            p++;
        }
        i++;
    }

    free(bitmapData);
    bitmapData = NULL;
    CGContextRelease(bitmap);
    bitmap = NULL;

    //NSLog(@"points: %d",p);

    return p;
}
+ (UIImage *)marge:(UIImage *)imageA withImage:(UIImage *)imageB {

    CGSize itemSize = CGSizeMake(imageA.size.width,  imageB.size.width);
    UIGraphicsBeginImageContext(itemSize);

    CGRect rect = CGRectMake(0,
                             0,
                             itemSize.width,
                             itemSize.height);
    [imageA drawInRect:rect];
    [imageB drawInRect:rect];

    UIImage *overlappedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return overlappedImage;
}