2011-01-06 13 views
13

Ad esempio, supponiamo di voler rilevare il colore del pixel con le coordinate dello schermo (100, 200). C'è un modo per fare questo?iOS: rileva il colore di un pixel?

MODIFICA - Non sono preoccupato per problemi di visualizzazione della retina per ora.

risposta

6

Questo non può essere la via più diretta, ma si potrebbe:

  1. Utilizzare UIGraphicsBeginImageContextWithOptions per afferrare schermo (vedi l'Apple Q & A QA1703 - "Screen Capture in UIKit Applications").

  2. Quindi utilizzare CGImageCreateWithImageInRect per afferrare la parte dell'immagine risultante richiesta.

  3. Infine, analizzare l'immagine risultante. E si complica, a questo punto, ma per fortuna c'è una domanda esistente che dovrebbe mostrare la strada: How to get the RGB values for a pixel on an image on the iphone

In alternativa, c'è il seguente articolo del blog che ha accompagna il codice: What Color is My Pixel? Image based color picker on iPhone

+0

Ugly ma dovrebbe funzionare –

+0

@WilliamJockusch L'ho implementato questo tuttavia voglio rilevare il colore (di appena 1 pixel sullo schermo) regolarmente (ogni 0,04 secondi usando un timer) creando uno screenshot dell'intero schermo lo sta facendo ritardo della mia app ... non hai trovato un modo più efficiente di memoria per fare questo hai fatto? E scuse per aver commentato un thread così vecchio! ;) – simonthumper

+0

@simonthumper Purtroppo no. Se non hai bisogno di afferrare lo schermo, probabilmente potresti fare le cose più velocemente. (Dipende molto dalla fonte dei dati dell'immagine.) Detto questo, sarei tentato di creare una nuova domanda (sebbene menzioni che hai letto/assorbito questa) se il problema che stai tentando di risolvere è sufficientemente diverso. –

5

Ecco come fare si

CGContextRef ctx; 
CGImageRef imageRef = [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); 

//GET PIXEL FROM POINT 
int index = 4*((width*round(yCoor))+round(xCoor)); 

int R = rawData[index]; 
int G = rawData[index+1]; 
int B = rawData[index+2]; 

NSLog(@"%d %d %d", R, G, B); 

//IF YOU WANT TO ALTER THE PIXELS 

int byteIndex = 0; 

for(int ii = 0 ; ii < width * height ; ++ii) 
{ 
    rawData[byteIndex] = (char)(newPixelValue); 
    rawData[byteIndex+1] = (char)(newPixelValue); 
    rawData[byteIndex+2] = (char)(newPixelValue); 

    byteIndex += 4; 
} 


ctx = CGBitmapContextCreate(rawData, 
          CGImageGetWidth(imageRef), 
          CGImageGetHeight(imageRef), 
          8, 
          CGImageGetBytesPerRow(imageRef), 
          CGImageGetColorSpace(imageRef), 
          kCGImageAlphaPremultipliedLast); 

imageRef = CGBitmapContextCreateImage(ctx); 
UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

CGContextRelease(ctx); 

image = rawImage; 

free(rawData); 
+0

Perché moltiplica l'indice con 4? Perché è 4 byte per pixel? – c0d3Junk13

+0

Sì! Red Green Blue Alpha –

+0

Come ottengo il colore rgb di uiview? –

0

Try This One Dove "self.m_imgvwSource" è l'UIView/UIImageView secondo il vostro bisogno

- (UIColor *) GetCurrentPixelColorAtPoint:(CGPoint)point 
{ 
    unsigned char pixel[4] = {0}; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast); 

    CGContextTranslateCTM(context, -point.x, -point.y); 

    [self.m_imgvwSource.layer renderInContext:context]; 

    CGContextRelease(context); 

    CGColorSpaceRelease(colorSpace); 

    NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]); 

    UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0]; 

    return color; 
} 
Problemi correlati