有時我們會用到獲取點(diǎn)擊某一點(diǎn)的顏色或者RGB,就好比琼蚯,控制燈的顏色酬凳,一個顏色板,點(diǎn)擊顏色板上的紅色遭庶,燈就會變紅宁仔,這個時候我們就會使用到。下面就是實(shí)現(xiàn)方法
原理峦睡,首先獲取一張屏幕截圖翎苫,在獲取截圖上面的顏色。
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
``
/**
獲取點(diǎn)擊的顏色
@param point 點(diǎn)擊的位置
@return 返回點(diǎn)擊地方的顏色
*/
- (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;
}
```
這樣就獲取了顏色以及對應(yīng)打印的RGB
3 如何使用
//點(diǎn)擊獲取點(diǎn)擊位置的顏色
-(IBAction)onClik:(UITapGestureRecognizer*)tap{
? ? CGPoint point = [tap locationInView:self];
? ? UIColor* color = [self getPixelColorAtLocation:point withImage:[self fullScreenshots]];
}
這樣就完成了阻逮,點(diǎn)擊任意一個位置,就可以獲取對應(yīng)的顏色和RGB