2013-03-23 3 views
1

Я пытаюсь получить цвет RGBA одного пикселя программно на устройстве iOS. В настоящее время у меня есть метод, однако он включает в себя скриншот всего экрана, а затем поиск цвета RGB центрального пикселя, потому что я хочу найти центральный пиксель каждый шаг в игре, что приводит к большому отставанию в производительности приложения, пока создается скриншот. По этой причине я хотел бы сделать скриншот только одного пикселя экрана, но не могу найти способ для этого в любом месте сети ... Вот мой текущий метод:iOS программный снимок экрана с одним пикселем

UIImage *screenImage = [self screenshot]; 

CGPoint pointToCheck = CGPointMake(0.5 , 0.5); 

UIColor *color = [self colorFromImage:screenImage sampledAtPoint:pointToCheck]; 

- (UIColor*)colorFromImage:(UIImage*)image sampledAtPoint:(CGPoint)p { 
    CGImageRef cgImage = [image CGImage]; 
    CGDataProviderRef provider = CGImageGetDataProvider(cgImage); 
    CFDataRef bitmapData = CGDataProviderCopyData(provider); 
    const UInt8* data = CFDataGetBytePtr(bitmapData); 
    size_t bytesPerRow = CGImageGetBytesPerRow(cgImage); 
    size_t width = CGImageGetWidth(cgImage); 
    size_t height = CGImageGetHeight(cgImage); 
    int col = p.x*(width-1); 
    int row = p.y*(height-1); 
    const UInt8* pixel = data + row*bytesPerRow+col*4; 
    UIColor* returnColor = [UIColor colorWithRed:pixel[0]/255. green:pixel[1]/255. blue:pixel[2]/255. alpha:1.0]; 
    CFRelease(bitmapData); 
    return returnColor; 
} 

- (UIImage *) screenshot 
{ 
    CGSize imageSize = [[UIScreen mainScreen] bounds].size; 
    if (NULL != UIGraphicsBeginImageContextWithOptions) 
     UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0); 
    else 
     UIGraphicsBeginImageContext(imageSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Iterate over every window from back to front 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
      // -renderInContext: renders in the coordinate space of the layer, 
      // so we must first apply the layer's geometry to the graphics context 
      CGContextSaveGState(context); 
      // Center the context around the window's anchor point 
      CGContextTranslateCTM(context, [window center].x, [window center].y); 
      // Apply the window's transform about the anchor point 
      CGContextConcatCTM(context, [window transform]); 
      // Offset by the portion of the bounds left of and above the anchor point 
      CGContextTranslateCTM(context, 
            -[window bounds].size.width * [[window layer] anchorPoint].x, 
            -[window bounds].size.height * [[window layer] anchorPoint].y); 

      // Render the layer hierarchy to the current context 
      [[window layer] renderInContext:context]; 

      // Restore the context 
      CGContextRestoreGState(context); 
     } 
    } 

    // Retrieve the screenshot image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

Сделав шаг назад, что вы пытаетесь захватить Colo (и) г для? (Другими словами, для чего игра использует и почему у игры уже нет копии базовых данных изображения.) –

+0

@middaparka Я использую MKMapView как карту для игры сверху вниз, я не совсем уверен в том, что игра повлечет за собой, так как я просто пытаюсь выяснить, действительно ли она достижима, но она будет вращаться вокруг разных областей на карте iOS. В меньшем количестве слов: я хочу определить, находится ли центральная точка карты на дороге или в торговом центре, или в воде, или в больнице и т. Д. – simonthumper

+0

Самый простой способ, которым я мог подумать об этом (а также только один) должен был определить цвет этого пикселя, а затем иметь ряд утверждений if, чтобы установить «тип земли», зависящий от цвета ... – simonthumper

ответ

0

Следуйте код здесь, чтобы получить цвет одного пикселя:

iOS -- detect the color of a pixel?

Надеется, что это помогает :)

+0

Как ни странно ... это точная статья, которую я использовал, чтобы получить результат, который у меня есть на данный момент: P Проблема по-прежнему заключается в том, что каждый раз нужно снимать снимок экрана всего экрана :) Но спасибо в любом случае! – simonthumper

+0

Убедитесь, что вы попробовали второй ответ на этот поток, принятый ответ не всегда правильный :) – virindh

+0

Второй по-прежнему требует UIImage всего экрана, который является процессом, который принимает все время: P Но да Я всегда стараюсь попробовать все ответы :) – simonthumper

Смежные вопросы