iOS - определить цвет пикселя? - PullRequest
14 голосов
/ 06 января 2011

Например, предположим, я хочу определить цвет пикселя с помощью экранных координат (100, 200). Есть ли способ сделать это?

РЕДАКТИРОВАТЬ - Я не беспокоюсь о проблемах с отображением сетчатки.

Ответы [ 3 ]

8 голосов
/ 06 января 2011

Это может быть не самый прямой маршрут, но вы можете:

  1. Используйте UIGraphicsBeginImageContextWithOptions для захвата экрана (см. Q & A QA1703 Apple - " Снимок экрана в приложениях UIKit ").

  2. Затем используйте CGImageCreateWithImageInRect , чтобы получить часть нужного вам результирующего изображения.

  3. Наконец, проанализируйте полученное изображение. Это усложняется на данный момент, но, к счастью, есть существующий вопрос, который должен показать вам путь: Как получить значения RGB для пикселя на изображении на iphone

В качестве альтернативы есть следующая статья в блоге с сопровождающим кодом: Какого цвета мой пиксель? Выбор цвета на основе изображения на iPhone

5 голосов
/ 26 января 2012

Вот как это сделать

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 голосов
/ 19 марта 2014

Попробуйте здесь, где «self.m_imgvwSource» - это представление uiview / uiimageview в соответствии с вашими потребностями

- (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;
}
...