1. 一、像素点颜色取样
  2. + (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {
  3. UIColor* color = nil;
  4. CGImageRef inImage = image.CGImage;
  5. CGContextRef cgctx = [DetectColour createARGBBitmapContextFromImage:
  6. inImage];
  7. if (cgctx == NULL) { return nil; /* error */ }
  8. size_t w = CGImageGetWidth(inImage);
  9. size_t h = CGImageGetHeight(inImage);
  10. CGRect rect = {{0,0},{w,h}};
  11. CGContextDrawImage(cgctx, rect, inImage);
  12. unsigned char* data = CGBitmapContextGetData (cgctx);
  13. if (data != NULL) {
  14. int offset = 4*((w*round(point.y))+round(point.x));
  15. int alpha =  data[offset];
  16. int red = data[offset+1];
  17. int green = data[offset+2];
  18. int blue = data[offset+3];
  19. NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,
  20. blue,alpha);
  21. NSLog(@"x:%f y:%f", point.x, point.y);
  22. color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:
  23. (blue/255.0f) alpha:(alpha/255.0f)];
  24. }
  25. CGContextRelease(cgctx);
  26. if (data) { free(data); }
  27. return color;
  28. }
  29. + (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {
  30. CGContextRef    context = NULL;
  31. CGColorSpaceRef colorSpace;
  32. void *          bitmapData;
  33. int             bitmapByteCount;
  34. int             bitmapBytesPerRow;
  35. size_t pixelsWide = CGImageGetWidth(inImage);
  36. size_t pixelsHigh = CGImageGetHeight(inImage);
  37. bitmapBytesPerRow   = (pixelsWide * 4);
  38. bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);
  39. colorSpace = CGColorSpaceCreateDeviceRGB();
  40. if (colorSpace == NULL)
  41. {
  42. fprintf(stderr, "Error allocating color space\n");
  43. return NULL;
  44. }
  45. bitmapData = malloc( bitmapByteCount );
  46. if (bitmapData == NULL)
  47. {
  48. fprintf (stderr, "Memory not allocated!");
  49. CGColorSpaceRelease( colorSpace );
  50. return NULL;
  51. }
  52. context = CGBitmapContextCreate (bitmapData,
  53. pixelsWide,
  54. pixelsHigh,
  55. 8,
  56. bitmapBytesPerRow,
  57. colorSpace,
  58. kCGImageAlphaPremultipliedFirst);
  59. if (context == NULL)
  60. {
  61. free (bitmapData);
  62. fprintf (stderr, "Context not created!");
  63. }
  64. CGColorSpaceRelease( colorSpace );
  65. return context;
  66. }

二、颜色匹配计算
一是精确的匹配,通过生成两个CGColor,利用CGColorEqualToColor函数进行对比即可,如下:

  1. //生成采样对照颜色(黑色)
  2. UIColor* sampleColor = [UIColor colorWithRed:(0/255.0f) green:(0/255.0f)
  3. blue:(0/255.0f) alpha:(255/255.0f)];
  4. //比较
  5. if (CGColorEqualToColor(detectedColor.CGColor, sampleColor.CGColor)) {
  6. //处理
  7. }

二是模糊的匹配,在RGB色彩空间下, 每个像素点的颜色有四个通道(R, G, B, Alpha),比较
两个颜色是否一致的方法,可以通过比较其向量的方式来进行,如下:

  1. //获取颜色分量
  2. const CGFloat* components = CGColorGetComponents(detectedColor.CGColor);
  3. CGFloat Red, Green, Blue, Alpha;
  4. Alpha = components[0];
  5. Red = components[0+1];
  6. ....
  7. //向量比较
  8. float difference = pow( pow((red1 - red2), 2) + pow((green1 - green2), 2) +
  9. pow((blue1 - blue2), 2), 0.5 );

至于阀值的设定,就需要大家根据实际情况来调整了,一般可设置为85,如果严格一点,则小一点;宽松一点,则可以设大一点。

ios像素点颜色取样的更多相关文章

  1. iOS状态栏颜色

    下面截图给出修改 iOS 状态栏颜色的 4 种方式 Target.png Info.plist.png Storyboard.png code.png 其中第四张图中的代码,直接写在你的任何一个 Vi ...

  2. 推荐一个iOS关于颜色的库-Wonderful

    Wonderful 这个库主要是与UIColor息息相连的,其中一共包含四个子文件,UIColor+Wonderful,UIColor+Separate,SXColorGradientView,SXM ...

  3. IOS 通用颜色快速生成代码

    通常情况下我们是直接使用类似于#EE1289这样的代码来直接表示RGB颜色的.但是在IOS语言中,它的颜色表示方式比较另类,他是使用一个0-1的小数来表示颜色值的.这样的实现,或许能够表示更多的颜色值 ...

  4. iOS随机颜色

    #import <UIKit/UIKit.h> @interface UIColor (RandomColor) +(UIColor *) randomColor; @end #impor ...

  5. iOS 通过颜色来生成一个纯色图片

    //通过颜色来生成一个纯色图片- (UIImage *)buttonImageFromColor:(UIColor *)color{        CGRect rect = CGRectMake(0 ...

  6. IOS 设置颜色的的详情

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  7. ios 根据颜色生成图片,十六进制颜色。

    //颜色生成图片方法 - (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size { CGRect rect = CGRectMake ...

  8. input标签添加上disable属性在移动端(ios)字体颜色及边框颜色不兼容的解决办法。

    手机一些兼容性问题: 1.苹果手机输入框input:disabled显示模糊问题 input:disabled, input[disabled]{ color: #5c5c5c; -webkit-te ...

  9. iOS view 颜色渐变

    //渐变色过渡自然 CAGradientLayer *layer = [CAGradientLayer layer]; layer.frame = CGRectMake(0, 0, curW-10,4 ...

随机推荐

  1. 【桌面虚拟化】之三 Persistent vs NonP

    作者:范军 (Frank Fan) 新浪微博:@frankfan7 在[桌面虚拟化]之二类型及案例中我们探讨了桌面虚拟化的两种架构,HostedVirtual Desktop (VDI) 和 Publ ...

  2. CCA概述和安装

    什么是CCA? 客户关怀加速器(CCA)为微软动态®CRM通过集中的客户信息从不同的系统在一个集成代理桌面促进剂的效率和有效性. CCA是一个參考应用,利用用户界面集成(UII)为微软Dynamics ...

  3. UIView属性clipsTobounds的应用

    view添加view,并剪边(UIView属性clipsTobounds的应用) 如题,有两个view: view1,view2 view1添加view2到其中,如果view2大于view1,或者vi ...

  4. iOS 8 Metal Swift教程(一) :开始学习

    在本篇教程中,你将应用到3D图形中的一系列矩阵变换,并会学习到如下内容: 如何使用模型(model),视图(view)以及投影变换(projection transformations). 如何使用矩 ...

  5. TCP/IP系列——长连接与短连接的区别

    1 什么是长连接和短连接       三次握手和四次挥手   TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败 ...

  6. WeiFenLuo.winFormsUI.Docking.dll的使用(停靠效果)

    1.  重置工具箱: 新建一个WinForm程序,项目名称为TestDockPanelControl.选中Form1窗体后选择工具箱--->>新建个添加选项卡命名为WeiFenLuo--- ...

  7. Intellij Idea 配置database 连接SQL Server 2012

    首先确认通过TCP IP来连接连接SQLServer 2012     确保 Server Authentication选择了SQL Server and Windows Authentication ...

  8. iOS-设计模式之代理反向传值

    代理设计模式就是自己的方法自己不实现,让代理对象去实现. 可以让多个类实现一组方法. 委托模式的好处在于: 1.避免子类化带来的过多的子类以及子类与父类的耦合 2.通过委托传递消息机制实现分层解耦 代 ...

  9. spring cuowu

    spring常见错误总结 在学习spring过程中遇见了种种不同的异常错误,这里做了一下总结,希望遇见类似错误的同学们共勉一下. 1. 错误一 Error creating bean with nam ...

  10. (原)ubuntu16中编译boost1.61.0库

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5797940.html 参考网址: http://www.boost.org/doc/libs/1_61 ...