我知道如何获得任何像素的颜色。为此我使用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,否则它应该继续检查屏幕的其余像素。
我已经实现了这种方式,但它会冻结并减慢应用程序的速度。不知道是否有其他方法可以遍历屏幕的所有像素。
请帮忙!
答案 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;
}