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. FZU 2102 Solve equation(水,进制转化)&& FZU 2111(贪心,交换使数字最小)

    C Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Pra ...

  2. RESTEasy 3.X Helloworld

    最近呢,RESTEasy也升级了.升到了3.X. 官网:http://www.jboss.org/resteasy 集成使用也非常简单(相比SOAP而言) 第一步:下载jar包 resteasy是托管 ...

  3. [每日一题] OCP1z0-047 :2013-08-17 EXTERNAL TABLE――加载数据 ............................56

    正确答案:C 一.对答案解释: A.       TYPE:有两个选可供选择: 1.        ORACLE_LOADER:传统方式,与SQLLDR一样,参数从多,应用较多. 2.         ...

  4. [Cycle.js] From toy DOM Driver to real DOM Driver

    This lessons shows how we are able to easily swap our toy DOM Driver with the actual Cycle.js DOM Dr ...

  5. CreateFile使用方法和样例

    函数原型: HANDLE CreateFile( LPCTSTR lpFileName, //指向文件名称的指针 DWORD dwDesiredAccess, //訪问模式(写/读) DWORD dw ...

  6. springmvc访问路径传递参数

    @RequestMapping(value = "/{path}/toList") public String toList(@PathVariable String path) ...

  7. jquery模仿css3延迟效果

    HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  8. 【转载】ADO.NET与ORM的比较(4):EntityFramework实现CRUD

    [转载]ADO.NET与ORM的比较(4):EntityFramework实现CRUD 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hiber ...

  9. html布局

    1.div <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8 ...

  10. linux下virtualenv的python版本

    virtualenv是python开发中一个重要的工具,它可以帮助我们创建一个干净的python解释环境,创建虚拟环境时,这个虚拟环境的 python版本往往是系统默认的2.x版本.别急,我们只需要一 ...