获取屏幕所有像素的颜色

时间:2014-04-23 12:22:53

标签: ios for-loop pixel

我知道如何获得任何像素的颜色。为此我使用ColorOfPoint方法

- (UIColor *) colorOfPoint:(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.layer renderInContext:context];

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);


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

现在,当我想要任何像素颜色时,我可以调用此方法。如果我想知道屏幕所有像素的颜色怎么办?我想我必须写2 for for循环

for (int x_axis=0; x_axis<screenWidth/2; x_axis++)
{
    for (int y_axis=0; y_axis<screenHeight/2; y_axis++)
    {
    }
}

我可以在这个for循环中调用这个函数。现在,如果像素颜色为红色,我想返回true,否则它应该继续检查屏幕的其余像素。

我已经实现了这种方式,但它会冻结并减慢应用程序的速度。不知道是否有其他方法可以遍历屏幕的所有像素。

请帮忙!

2 个答案:

答案 0 :(得分:0)

OMG,

你渲染整个屏幕只是为了获得一个像素的颜色,对吗?因此,如果您有156000像素,则会将屏幕渲染156000次。这真的很慢。你应该只渲染一次屏幕!

答案 1 :(得分:0)

在创建颜色空间时迭代循环一次。请参阅更新的代码:

- (BOOL) isRedPresent
{
    CGPoint point;
    unsigned char pixel[4] = {0};
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4,
           colorSpace,  kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);

    BOOL isRed = FALSE;
    for (int x_axis=0; x_axis<screenWidth/2; x_axis++)
    {
         for (int y_axis=0; y_axis<screenHeight/2; y_axis++)
         {
                CGContextTranslateCTM(context, -x_axis, -y_axis);
                [self.layer renderInContext:context];
                if(pixel[0] == 255 && pixel[1] == 0 && pixel[2] == 0)
                {
                       isRed = TRUE;
                       break;
                }
          }
    } 

    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);
    return isRed;
}