ios像素点颜色取样
- 一、像素点颜色取样
- + (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {
- UIColor* color = nil;
- CGImageRef inImage = image.CGImage;
- CGContextRef cgctx = [DetectColour 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 = (pixelsWide * 4);
- bitmapByteCount = (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;
- }
二、颜色匹配计算
一是精确的匹配,通过生成两个CGColor,利用CGColorEqualToColor函数进行对比即可,如下:
- //生成采样对照颜色(黑色)
- UIColor* sampleColor = [UIColor colorWithRed:(0/255.0f) green:(0/255.0f)
- blue:(0/255.0f) alpha:(255/255.0f)];
- //比较
- if (CGColorEqualToColor(detectedColor.CGColor, sampleColor.CGColor)) {
- //处理
- }
二是模糊的匹配,在RGB色彩空间下, 每个像素点的颜色有四个通道(R, G, B, Alpha),比较
两个颜色是否一致的方法,可以通过比较其向量的方式来进行,如下:
- //获取颜色分量
- const CGFloat* components = CGColorGetComponents(detectedColor.CGColor);
- CGFloat Red, Green, Blue, Alpha;
- Alpha = components[0];
- Red = components[0+1];
- ....
- //向量比较
- float difference = pow( pow((red1 - red2), 2) + pow((green1 - green2), 2) +
- pow((blue1 - blue2), 2), 0.5 );
至于阀值的设定,就需要大家根据实际情况来调整了,一般可设置为85,如果严格一点,则小一点;宽松一点,则可以设大一点。
ios像素点颜色取样的更多相关文章
- iOS状态栏颜色
下面截图给出修改 iOS 状态栏颜色的 4 种方式 Target.png Info.plist.png Storyboard.png code.png 其中第四张图中的代码,直接写在你的任何一个 Vi ...
- 推荐一个iOS关于颜色的库-Wonderful
Wonderful 这个库主要是与UIColor息息相连的,其中一共包含四个子文件,UIColor+Wonderful,UIColor+Separate,SXColorGradientView,SXM ...
- IOS 通用颜色快速生成代码
通常情况下我们是直接使用类似于#EE1289这样的代码来直接表示RGB颜色的.但是在IOS语言中,它的颜色表示方式比较另类,他是使用一个0-1的小数来表示颜色值的.这样的实现,或许能够表示更多的颜色值 ...
- iOS随机颜色
#import <UIKit/UIKit.h> @interface UIColor (RandomColor) +(UIColor *) randomColor; @end #impor ...
- iOS 通过颜色来生成一个纯色图片
//通过颜色来生成一个纯色图片- (UIImage *)buttonImageFromColor:(UIColor *)color{ CGRect rect = CGRectMake(0 ...
- IOS 设置颜色的的详情
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...
- ios 根据颜色生成图片,十六进制颜色。
//颜色生成图片方法 - (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size { CGRect rect = CGRectMake ...
- input标签添加上disable属性在移动端(ios)字体颜色及边框颜色不兼容的解决办法。
手机一些兼容性问题: 1.苹果手机输入框input:disabled显示模糊问题 input:disabled, input[disabled]{ color: #5c5c5c; -webkit-te ...
- iOS view 颜色渐变
//渐变色过渡自然 CAGradientLayer *layer = [CAGradientLayer layer]; layer.frame = CGRectMake(0, 0, curW-10,4 ...
随机推荐
- python -序列化
python中用于序列化的两个模块 json 用于[字符串]和[python基本数据类型]之间进行转换 pickle 用于[python特有的类型] 和 [python基本数据类型]间进行转换 Jso ...
- php + apache + mysql
http://archive.apache.org/dist/httpd/binaries/win32/ Apache msi 下载地址
- CSU 1808 地铁
题意: ICPCCamp 有 n 个地铁站,用 1,2,-,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i 段地铁属于 ci 号线,位于站 ai,bi 之间,往返均需要花费 ti 分钟 ...
- Canvas绘图方法和图像处理方法(转)
转自:http://javascript.ruanyifeng.com/htmlapi/canvas.html 概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它 ...
- flex 调用WebService2(基于.net)
flex 访问WebService的方法有很多种,使用FLEX4中的"数据/服务"功能可以自动生成访问WebService的代理类,这样可以避免把所有的数据访问都写到MXML页面上 ...
- orcl 行转列的存储过程
CREATE or replace PROCEDURE sp_fixWage AUTHID CURRENT_USER as --此处需要注意的 authid current_user 这个属性 详细 ...
- (原)error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5577534.html 在debug下使用intel的mkl库时(release下无此问题),莫名的出现 ...
- juqery合成事件toggle方法
当指定元素被点击时,在两个或多个函数之间轮流切换. 如果规定了两个以上的函数,则 toggle() 方法将切换所有函数.例如,如果存在三个函数,则第一次点击将调用第一个函数,第二次点击调用第二个函数, ...
- XML为数据库进行增删改查(实例)
//增删改查文件 package xml2; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.Fi ...
- 【2】python核心编程 第四章-python对象
1.python对象 所有的Python 对像都拥有三个特性:身份,类型和值. 身份: 每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到. 这个值可以被认为是该对象的 ...