ios 图片像素点取颜色,判断颜色是否为亮色,颜色对比
来源:互联网 发布:如何设置淘宝分流 编辑:程序博客网 时间:2024/05/17 02:18
做项目的时候遇到一个问题,在图片的某一点取其颜色值然后根据该颜色值是否为亮色使控件显示为不同的状态、颜色。
下面是怎么在图片中取到颜色值
+ (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image { UIColor* color = nil; CGImageRef inImage = image.CGImage; CGContextRef cgctx = [GetImageOnePointColor createARGBBitmapContextFromImage: inImage]; if (cgctx == NULL) { return nil; /* error */ } size_t w = CGImageGetWidth(inImage); size_t h = CGImageGetHeight(inImage); CGRect rect = {{0,0},{w,h}}; CGContextDrawImage(cgctx, rect, inImage); unsigned char* data = CGBitmapContextGetData (cgctx); if (data != NULL) { int offset = 4*((w*round(point.y))+round(point.x)); 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);// // NSLog(@"x:%f y:%f", point.x, point.y); color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue: (blue/255.0f) alpha:(alpha/255.0f)]; } CGContextRelease(cgctx); if (data) { free(data); } return color;}+ (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage { CGContextRef context = NULL; CGColorSpaceRef colorSpace; void * bitmapData; int bitmapByteCount; int bitmapBytesPerRow; size_t pixelsWide = CGImageGetWidth(inImage); size_t pixelsHigh = CGImageGetHeight(inImage); bitmapBytesPerRow = (int)(pixelsWide * 4); bitmapByteCount = (int)(bitmapBytesPerRow * pixelsHigh); colorSpace = CGColorSpaceCreateDeviceRGB(); if (colorSpace == NULL) { fprintf(stderr, "Error allocating color space\n"); return NULL; } bitmapData = malloc( bitmapByteCount ); if (bitmapData == NULL) { fprintf (stderr, "Memory not allocated!"); CGColorSpaceRelease( colorSpace ); return NULL; } context = CGBitmapContextCreate (bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst); if (context == NULL) { free (bitmapData); fprintf (stderr, "Context not created!"); } CGColorSpaceRelease( colorSpace ); return context;}
下面代码可以判断某一个颜色是否为亮色
//判断颜色是不是亮色+ (BOOL) isLightColor:(UIColor*)color { CGFloat components[3]; [UIColor getRGBComponents:components forColor:color];// NSLog(@"%f %f %f", components[0], components[1], components[2]); CGFloat num = components[0] + components[1] + components[2]; if(num < 382) return NO; else return YES;}//获取RGB值+ (void)getRGBComponents:(CGFloat [3])components forColor:(UIColor *)color {#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1 int bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast;#else int bitmapInfo = kCGImageAlphaPremultipliedLast;#endif CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); unsigned char resultingPixel[4]; CGContextRef context = CGBitmapContextCreate(&resultingPixel, 1, 1, 8, 4, rgbColorSpace, bitmapInfo); CGContextSetFillColorWithColor(context, [color CGColor]); CGContextFillRect(context, CGRectMake(0, 0, 1, 1)); CGContextRelease(context); CGColorSpaceRelease(rgbColorSpace); for (int component = 0; component < 3; component++) { components[component] = resultingPixel[component]; }}
下面代码可以判断两个颜色值是否相同
enum { enEqual, enNotEaual, enCannotConvert, }; typedef NSInteger KCompareResult;+ (KCompareResult) isTheSameColor:(UIColor*)color redValue:(CGFloat)rValue greenValue:(CGFloat)gValue blueValue:(CGFloat)bValue alphaValue:(CGFloat)aValue{ if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) { CGFloat redValue, greenValue, blueValue, alphaValue; if ([color getRed:&redValue green:&greenValue blue:&blueValue alpha:&alphaValue]) { if (redValue == rValue && greenValue == gValue && blueValue == bValue && alphaValue == aValue) { return enEqual; } else { return enNotEaual; } } else { // can not convert return enCannotConvert; } }}
但是这样写感觉有点儿繁琐于是我采用了ios5之后才有的一个方法CGColorEqualToColor(color1.CGColor, color2.CGColor)
UIColor *color1 = [GetImageOnePointColor getPixelColorAtLocation:CGPointMake(1.0, 1.0) inImage:image];UIColor *color2 = [UIColor whiteColor];- (BOOL) isTheSameColor2:(UIColor*)color1 anotherColor:(UIColor*)color2{ if (CGColorEqualToColor(color1.CGColor, color2.CGColor)) { return YES; } else { return NO; }}
但是无论我怎么试,取的颜色中分明有白色返回结果却始终为NO。
后来我把对比颜色白色,UIcolor改成RGB颜色即
0 0
- ios 图片像素点取颜色,判断颜色是否为亮色,颜色对比
- 获取图片像素点颜色值
- 判断背景图片为暗色还是亮色,来修改主题文字颜色
- Cocos2dx图片像素颜色值获取,可用于判断是否是图片的透明区域
- 取像素颜色的方法
- opengl 获取像素点颜色
- iOS颜色摄合器,获取图片某点的颜色值
- 颜色判断是否相等
- php 获取图片像素颜色
- 获取图片像素颜色,转换为CSS3 box-shadow显示
- ios 将颜色转化为图片
- delphi 取屏幕点颜色
- iOS 创建颜色图片
- cocos2d判断精灵某点颜色是否有效
- 判断颜色是否相等UIColor
- 判断两个颜色是否相等
- Graphics2D、获取当前像素点颜色
- 提取某种颜色的像素点
- 信息安全技术实验二网络扫描实验+ARP攻击
- 《从JAVA到Android》JAVA篇之认识JAVA
- 前端推荐网站
- 高通801开发笔记一 通过串口终端调试和adb调试程序的运行结果不同
- Qtcrreator 4 (Qt5.7) on rhel 7 x86_64 添加配置astyle,美化代码配置方法
- ios 图片像素点取颜色,判断颜色是否为亮色,颜色对比
- 如何在测试中保持spring容器的存在
- SQL注入--sqlmap自动化注入工具
- 运行Java应用必须通过main()方法吗?
- 打印JQuery
- ASP.Net页面生命周期
- MFC的EXE调用VBS,并获取VBS的返回值状态码
- VBS获取本地IIS中网站的信息(IP、端口、站点名称)
- linux定时任务执行