zoukankan      html  css  js  c++  java
  • 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 ");  
    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,如果严格一点,则小一点;宽松一点,则可以设大一点。
  • 相关阅读:
    配置伪静态的好处
    RewriteCond和13个mod_rewrite应用举例Apache伪静态
    什么是伪静态?伪静态有何作用?
    推荐16个下载超酷脚本的热门网站
    thinkphp 表单自动验证功能
    窗体界面设计03
    ExtJs双折线图
    课程设计之"网络考试系统"(php、Extjs)
    布局元素和用户控件设计Silverlight网站02
    Silverlight的皮肤转换和datagrid数据显示
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5105868.html
Copyright © 2011-2022 走看看