用coord验证像素(iOS)

时间:2012-04-09 00:12:47

标签: ios uiimage cgimage

在我看来,我的子视图很少。这是UIImageView。

每个UIImageView都包含带有alpha chanel的图像。

这是一张图片: enter image description here

我使用下面的方法在位置视图中检测我的触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{   

    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.view];

    NSArray *views = [self.view subviews];

    for (UIView *v in views) {
        if([v isKindOfClass:[Piece class]]){
            if (CGRectContainsPoint(v.frame, touchLocation) && ((Piece *)v).snapped == FALSE) { 

                UITouch* touchInPiece = [touches anyObject]; 
                CGPoint point = [touchInPiece locationInView:(Piece *)v];
                BOOL solidColor = [self verifyAlphaPixelImage:(Piece *)v atX:point.x atY:point.y];

                if (solidColor) {                    
                    dragging = YES;
                    oldX = touchLocation.x;
                    oldY = touchLocation.y;
                    piece = (Piece *)v;
                    [self.view bringSubviewToFront:piece];
                    break;
                }              

            }
        }
    }
}

此验证alpha像素的方法

- (BOOL)verifyAlphaPixelImage:(Piece *)image atX:(int)x atY:(int)y{

    CGImageRef imageRef = [image.image CGImage];
    NSUInteger width = CGImageGetWidth(imageRef);
    NSUInteger height = CGImageGetHeight(imageRef);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData = malloc(height * width * 4);
    NSUInteger bytesPerPixel = 4;
    NSUInteger bytesPerRow = bytesPerPixel * width;
    NSUInteger bitsPerComponent = 8;
    CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                                 bitsPerComponent, bytesPerRow, colorSpace,
                                                 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
    CGColorSpaceRelease(colorSpace);    
    CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);
    CGContextRelease(context);    
    // Now your rawData contains the image data in the RGBA8888 pixel format.
    int byteIndex = (bytesPerRow * y) + x * bytesPerPixel;
    //    CGFloat red   = (rawData[byteIndex]     ) ;
    //    CGFloat green = (rawData[byteIndex + 1] ) ;
    //    CGFloat blue  = (rawData[byteIndex + 2] ) ;
    CGFloat alpha = (rawData[byteIndex + 3] ) ;   
    NSLog(@"%f", alpha);
    free(rawData);    
    if(alpha==255.0) return NO;
    else return YES;



}

如果创建了alpha像素,我需要触摸UCLmageView下面的其他UIImageView,我之前已经使用了tapp。

例如,如果我已经堆叠UIImageView并且我先触摸:

现在我应该首先验证UIImageView

如果我触及alpha像素 - >我应该用这个coord移动到下一个UIImageView,并验证它是否为alpha像素。

如果第二个第3个,第4个或第5个没有我的坐标的alpha像素,我应该选择这个UIImageView。

现在我验证我的像素 - 但我的方法返回错误的值。

1 个答案:

答案 0 :(得分:1)

  1. How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?的讨论中,有一个更正 你正在使用的例程。使用calloc而不是malloc,或者你将开始 获得任意结果。
  2. 如果您的Piece课程曾对图像进行缩放,则需要按照图像显示的比例缩放其x和y输入。
  3. touchesBegan方法奇怪地查看它包含的其他视图,而不是其自身。是否有一个原因?什么课程是touchesBegan
  4. 子视图从后到前按照绘制顺序存储,因此当您遍历子视图时,您将首先查看(并可能选择)最后面的对象。从subviews的最后一个元素向右前方迭代。
  5. 即使在此工作之后,每次用户点击时渲染每个Piece图像效率都会非常低。您最终希望缓存每个Piece的像素数据以进行快速查找。