iOS 点击屏幕获取,获取点击位置颜色和对应RGB

有时我们会用到获取点击某一点的颜色或者RGB,就好比,控制灯的颜色,一个颜色板,点击颜色板上的红色,灯就会变红,这个时候我们就会使用到。下面就是实现方法

原理,首先获取一张屏幕截图,在获取截图上面的颜色。

1  获取屏幕截图,但不是真的会截图,只是生成了一个Image对象

/**

获取屏幕截图

@return 返回屏幕截图

*/

-(UIImage *)fullScreenshots{

    UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow];

    UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图,包括window

    [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();

    return viewImage;

}

2  接下来就是获取颜色和RGB

/**

获取点击的颜色

@param point 点击的位置

@return 返回点击地方的颜色

*/

- (UIColor*) getPixelColorAtLocation:(CGPoint)point withImage:(UIImage*) image {

    UIColor* color = nil;

    CGImageRef inImage = image.CGImage;

    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue

    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];

    if (cgctx == NULL) { return nil;  }


    size_t w = CGImageGetWidth(inImage);

    size_t h = CGImageGetHeight(inImage);

    CGRect rect = {{0,0},{w,h}};


    // Draw the image to the bitmap context. Once we draw, the memory

    // allocated for the context for rendering will then contain the

    // raw image data in the specified color space.

    CGContextDrawImage(cgctx, rect, inImage);


    // Now we can get a pointer to the image data associated with the bitmap

    // context.

    unsigned char* data = CGBitmapContextGetData (cgctx);

    if (data != NULL) {

        //offset locates the pixel in the data from x,y.

        //4 for 4 bytes of data per pixel, w is width of one row of data.

        @try {

            int offset = 4*((w*round(point.y))+round(point.x));

            NSLog(@"offset: %d", offset);

            int alpha =  data[offset];

            int red = data[offset+1];

            int green = data[offset+2];

            int blue = data[offset+3];

            NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,blue,alpha);

            color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:(blue/255.0f) alpha:(alpha/255.0f)];

        }

        @catch (NSException * e) {

            NSLog(@"%@",[e reason]);

        }

        @finally {

        }


    }

    return color;

}

- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {


    CGContextRef    context = NULL;

    CGColorSpaceRef colorSpace;

    void *          bitmapData;

    int            bitmapByteCount;

    int            bitmapBytesPerRow;


    // Get image width, height. We'll use the entire image.

    size_t pixelsWide = CGImageGetWidth(inImage);

    size_t pixelsHigh = CGImageGetHeight(inImage);


    // Declare the number of bytes per row. Each pixel in the bitmap in this

    // example is represented by 4 bytes; 8 bits each of red, green, blue, and

    // alpha.

    bitmapBytesPerRow  = (pixelsWide * 4);

    bitmapByteCount    = (bitmapBytesPerRow * pixelsHigh);


    // Use the generic RGB color space.

    colorSpace = CGColorSpaceCreateDeviceRGB();


    if (colorSpace == NULL)

    {

        fprintf(stderr, "Error allocating color spacen");

        return NULL;

    }


    // Allocate memory for image data. This is the destination in memory

    // where any drawing to the bitmap context will be rendered.

    bitmapData = malloc( bitmapByteCount );

    if (bitmapData == NULL)

    {

        fprintf (stderr, "Memory not allocated!");

        CGColorSpaceRelease( colorSpace );

        return NULL;

    }


    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits

    // per component. Regardless of what the source image format is

    // (CMYK, Grayscale, and so on) it will be converted over to the format

    // specified here by CGBitmapContextCreate.

    context = CGBitmapContextCreate (bitmapData,

                                    pixelsWide,

                                    pixelsHigh,

                                    8,      // bits per component

                                    bitmapBytesPerRow,

                                    colorSpace,

                                    kCGImageAlphaPremultipliedFirst);

    if (context == NULL)

    {

        free (bitmapData);

        fprintf (stderr, "Context not created!");

    }

    // Make sure and release colorspace before returning

    CGColorSpaceRelease( colorSpace );


    return context;

}

这样就获取了颜色以及对应打印的RGB

3 如何使用

//点击获取点击位置的颜色

-(IBAction)onClik:(UITapGestureRecognizer*)tap{

    CGPoint point = [tap locationInView:self];

    UIColor* color = [self getPixelColorAtLocation:point withImage:[self fullScreenshots]];

}

这样就完成了,点击任意一个位置,就可以获取对应的颜色和RGB

你可能感兴趣的:(iOS 点击屏幕获取,获取点击位置颜色和对应RGB)