确定UIImageView区域中透明像素的百分比

时间:2011-08-16 17:26:43

标签: iphone objective-c ios uiimageview

我正在尝试为UIImageView中定义的像素设置碰撞类型命中测试。我只希望循环定义区域中的像素。

这是我到目前为止所拥有的:

- (BOOL)cgHitTestForArea:(CGRect)area {
    BOOL hit = FALSE;

    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();

    float areaFloat = ((area.size.width * 4) * area.size.height);
    unsigned char *bitmapData = malloc(areaFloat);    

    CGContextRef context = CGBitmapContextCreate(bitmapData,
                                                 area.size.width,
                                                 area.size.height,
                                                 8,
                                                 4*area.size.width,
                                                 colorspace,
                                                 kCGImageAlphaPremultipliedLast);
    CGContextTranslateCTM(context, -area.origin.x, -area.origin.y);
    [self.layer renderInContext:context];

    //Seek through all pixels.    
    float transparentPixels = 0;
    for (int i = 0; i < (int)areaFloat ; i += 4) {
        //Count each transparent pixel.
        if (((bitmapData[i + 3] * 1.0) / 255.0) == 0) {
            transparentPixels += 1;
        }
    }
    free(bitmapData);

    //Calculate the percentage of transparent pixels. 
    float hitTolerance = [[self.layer valueForKey:@"hitTolerance"]floatValue];

    NSLog(@"Apixels: %f hitPercent: %f",transparentPixels,(transparentPixels/areaFloat));

    if ((transparentPixels/(areaFloat/4)) < hitTolerance) {
        hit = TRUE;
    }    

    CGColorSpaceRelease(colorspace);
    CGContextRelease(context);

    return hit;    
}

是否有人能够提供任何不起作用的理由?

1 个答案:

答案 0 :(得分:1)

我建议使用ANImageBitmapRep。它允许对图像进行简单的像素级操作,而无需上下文的麻烦,与其他库链接或原始内存分配。要使用视图的内容创建ANImgaeBitmapRep,您可以执行以下操作:

BMPoint sizePt = BMPointMake((int)self.frame.size.width, 
                             (int)self.frame.size.height);
ANImageBitmapRep * irep = [[ANImageBitmapRep alloc] initWithSize:sizePt];
CGContextRef ctx = [irep context];
[self.layer renderInContext:context];
[irep setNeedsUpdate:YES];

然后,您可以裁剪出所需的矩形。请注意,坐标相对于视图的左下角:

// assuming aFrame is our frame
CGRect cFrame = CGRectMake(aFrame.origin.x,
                           self.frame.size.height - (aFrame.origin.y + aFrame.size.height),
                           aFrame.size.width, aFrame.size.height);

[irep cropFrame:];

最后,您可以使用以下方法在图像中找到alpha的百分比:

double totalAlpha;
double totalPixels;
for (int x = 0; x < [irep bitmapSize].x; x++) {
    for (int y = 0; y < [irep bitmapSize].y; y++) {
        totalAlpha += [irep getPixelAtPoint:BMPointMake(x, y)].alpha;
        totalPixels += 1;
    }
}
double alphaPct = totalAlpha / totalPixels;

然后,您可以将alphaPct变量用作0到1之间的百分比。请注意,为了防止泄漏,您必须使用release ANImageBitmapRep释放[irep release]对象。

希望我帮忙。在iOS开发方面,图像数据是一个有趣且有趣的领域。