获取当前显示屏幕某一点的颜色
2015-11-03 09:57
393 查看
获取当前显示屏幕某一点的颜色
1、 获取当前屏幕的截图
2、 通过图片获取点颜色
3、 使用方法
在url加载完成后,根据webview的navigationbar颜色确定状态栏背景颜色,保持一致风格
1、 获取当前屏幕的截图
-(UIImage *)fullScreenshots{ UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图,包括window [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); return viewImage; }
2、 通过图片获取点颜色
- (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; }
3、 使用方法
- (void)webViewDidFinishLoad:(UIWebView *)webView { if (_backView) { [self performSelector:@selector(changeColor) withObject:nil afterDelay:.5]; } } - (void) changeColor { UIColor* color = [self getPixelColorAtLocation:CGPointMake(4, 22) withImage:[self fullScreenshots]]; if (color && !CGColorEqualToColor(color.CGColor, _backView.backgroundColor.CGColor)) { _backView.backgroundColor = color; } }
在url加载完成后,根据webview的navigationbar颜色确定状态栏背景颜色,保持一致风格
相关文章推荐
- SVN备份库+库迁移
- Hadoop分布式文件系统HDFS的工作原理
- ECharts (百度团队做的分析图)
- Map遍历方法
- 【Flex 时间控件求助】
- vi/vim 查找替换命令
- singleton
- oracle 游标
- CuratorFramework实现zookeeper文件夹与文件的上传下载
- 黑马程序员-----String类和StringBuffer类总结
- 使用硬件层来实现灰度视图
- css背景
- Linux下shell之脚本编写基础
- Mongodb学习笔记(一)
- linux中shell变量$#,$@,$0,$1,$2的含义
- PHP发起get post put delete请求
- linux 安装安装rz/sz 和 ssh
- oracle添加主键自增长
- ECMA5数组的新增方法有哪些及forEach()模仿实现
- asp.net mvc jquery+js+ajax 实现联动