ios像素点颜色取样

  1. 一、像素点颜色取样
  2. + (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {  
  3.   
  4.     UIColor* color = nil;  
  5.     CGImageRef inImage = image.CGImage;  
  6.     CGContextRef cgctx = [DetectColour createARGBBitmapContextFromImage:  
  7.     inImage];  
  8.   
  9.     if (cgctx == NULL) { return nil; /* error */ }  
  10.     size_t w = CGImageGetWidth(inImage);  
  11.     size_t h = CGImageGetHeight(inImage);  
  12.     CGRect rect = {{0,0},{w,h}};  
  13.   
  14.     CGContextDrawImage(cgctx, rect, inImage);  
  15.   
  16.     unsigned char* data = CGBitmapContextGetData (cgctx);  
  17.   
  18.     if (data != NULL) {  
  19.        int offset = 4*((w*round(point.y))+round(point.x));  
  20.        int alpha =  data[offset];  
  21.        int red = data[offset+1];  
  22.        int green = data[offset+2];  
  23.        int blue = data[offset+3];  
  24.        NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,  
  25.        blue,alpha);  
  26.   
  27.        NSLog(@"x:%f y:%f", point.x, point.y);  
  28.   
  29.        color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:  
  30.        (blue/255.0f) alpha:(alpha/255.0f)];  
  31.     }  
  32.   
  33.     CGContextRelease(cgctx);  
  34.   
  35.     if (data) { free(data); }  
  36.   
  37.     return color;  
  38.   
  39. }  
  40. + (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {  
  41.   
  42. CGContextRef    context = NULL;  
  43.   
  44. CGColorSpaceRef colorSpace;  
  45.   
  46. void *          bitmapData;  
  47.   
  48. int             bitmapByteCount;  
  49.   
  50. int             bitmapBytesPerRow;  
  51.   
  52. size_t pixelsWide = CGImageGetWidth(inImage);  
  53.   
  54. size_t pixelsHigh = CGImageGetHeight(inImage);  
  55.   
  56. bitmapBytesPerRow   = (pixelsWide * 4);  
  57.   
  58. bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);  
  59.   
  60. colorSpace = CGColorSpaceCreateDeviceRGB();  
  61.   
  62. if (colorSpace == NULL)  
  63.   
  64. {  
  65.   
  66. fprintf(stderr, "Error allocating color space\n");  
  67.   
  68. return NULL;  
  69.   
  70. }  
  71.   
  72. bitmapData = malloc( bitmapByteCount );  
  73.   
  74. if (bitmapData == NULL)  
  75.   
  76. {  
  77.   
  78. fprintf (stderr, "Memory not allocated!");  
  79.   
  80. CGColorSpaceRelease( colorSpace );  
  81.   
  82. return NULL;  
  83.   
  84. }      
  85.   
  86. context = CGBitmapContextCreate (bitmapData,  
  87.   
  88. pixelsWide,  
  89.   
  90. pixelsHigh,  
  91.   
  92. 8,        
  93.   
  94. bitmapBytesPerRow,  
  95.   
  96. colorSpace,  
  97.   
  98. kCGImageAlphaPremultipliedFirst);  
  99.   
  100. if (context == NULL)  
  101.   
  102. {  
  103.   
  104. free (bitmapData);  
  105.   
  106. fprintf (stderr, "Context not created!");  
  107.   
  108. }  
  109.   
  110. CGColorSpaceRelease( colorSpace );  
  111.   
  112. return context;  
  113.   
  114. }  

二、颜色匹配计算
一是精确的匹配,通过生成两个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,如果严格一点,则小一点;宽松一点,则可以设大一点。
posted @ 2016-01-06 15:43  brave-sailor  阅读(518)  评论(0编辑  收藏  举报