代码之家  ›  专栏  ›  技术社区  ›  0x90

如何获取uiview中像素的颜色?

  •  32
  • 0x90  · 技术社区  · 15 年前

    我正在开发一个小应用程序。在它中,我需要检测uiview中像素的颜色。我有一个CGpoint定义我需要的像素。使用CoreAnimation更改uiView的颜色。

    我知道有一些复杂的方法可以从uiimages中提取颜色信息。但是我找不到uiviews的解决方案。

    在伪代码中,我在寻找

    pixel = [view getPixelAtPoint:myPoint];
    UIColor *mycolor = [pixel getColor];
    

    任何意见都非常感谢。

    4 回复  |  直到 8 年前
        1
  •  8
  •   Collin Price    13 年前

    这是相当可怕和缓慢。基本上,您创建一个位图上下文,其中包含一个您分配的后备存储,这样您就可以读取内存,然后在上下文中呈现视图层,并读取RAM中的适当点。

    如果您已经知道如何对图像执行此操作,则可以执行以下操作:

    - (UIImage *)imageForView:(UIView *)view {
      UIGraphicsBeginImageContext(view.frame.size);
      [view.layer renderInContext: UIGraphicsGetCurrentContext()];
      UIImage *retval = UIGraphicsGetImageFromCurrentImageContext(void);
      UIGraphicsEndImageContext();
    
      return retval;
    }
    

    然后你会得到一个图像,在那里你可以得到像素数据。我相信您处理图像的机制无论如何都涉及到将它们呈现到一个上下文中,因此您可以将其与此合并,并考虑实际的图像创建。因此,如果您采用这种方法,可以删除加载图像的位,并将其替换为上下文渲染:

    [view.layer renderInContext: UIGraphicsGetCurrentContext()];
    

    你应该很好。

        2
  •  76
  •   ivanzoid    10 年前

    以下是更有效的解决方案:

    // UIView+ColorOfPoint.h
    @interface UIView (ColorOfPoint)
    - (UIColor *) colorOfPoint:(CGPoint)point;
    @end
    
    // UIView+ColorOfPoint.m
    #import "UIView+ColorOfPoint.h"
    #import <QuartzCore/QuartzCore.h>
    
    @implementation UIView (ColorOfPoint)
    
    - (UIColor *) colorOfPoint:(CGPoint)point
    {
        unsigned char pixel[4] = {0};
    
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    
        CGContextRef context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
    
        CGContextTranslateCTM(context, -point.x, -point.y);
    
        [self.layer renderInContext:context];
    
        CGContextRelease(context);
        CGColorSpaceRelease(colorSpace);
    
        //NSLog(@"pixel: %d %d %d %d", pixel[0], pixel[1], pixel[2], pixel[3]);
    
        UIColor *color = [UIColor colorWithRed:pixel[0]/255.0 green:pixel[1]/255.0 blue:pixel[2]/255.0 alpha:pixel[3]/255.0];
    
        return color;
    }
    
    @end
    

    链接到文件: https://github.com/ivanzoid/ikit/tree/master/UIView+ColorOfPoint

        3
  •  21
  •   Riad Krim    8 年前

    迅速的版本 伊凡锌 的答案

    斯威夫特3

    extension CALayer {
    
        func colorOfPoint(point:CGPoint) -> CGColor {
    
            var pixel: [CUnsignedChar] = [0, 0, 0, 0]
    
            let colorSpace = CGColorSpaceCreateDeviceRGB()
            let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    
            let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)
    
            context!.translateBy(x: -point.x, y: -point.y)
    
            self.render(in: context!)
    
            let red: CGFloat   = CGFloat(pixel[0]) / 255.0
            let green: CGFloat = CGFloat(pixel[1]) / 255.0
            let blue: CGFloat  = CGFloat(pixel[2]) / 255.0
            let alpha: CGFloat = CGFloat(pixel[3]) / 255.0
    
            let color = UIColor(red:red, green: green, blue:blue, alpha:alpha)
    
            return color.cgColor
        }
    }
    

    斯威夫特2

    extension CALayer {
    
        func colorOfPoint(point:CGPoint)->CGColorRef
        {
            var pixel:[CUnsignedChar] = [0,0,0,0]
    
            let colorSpace = CGColorSpaceCreateDeviceRGB()
            let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedLast.rawValue)
    
            let context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, colorSpace, bitmapInfo.rawValue)
    
            CGContextTranslateCTM(context, -point.x, -point.y)
    
            self.renderInContext(context!)
    
            let red:CGFloat = CGFloat(pixel[0])/255.0
            let green:CGFloat = CGFloat(pixel[1])/255.0
            let blue:CGFloat = CGFloat(pixel[2])/255.0
            let alpha:CGFloat = CGFloat(pixel[3])/255.0
    
            let color = UIColor(red:red, green: green, blue:blue, alpha:alpha)
    
            return color.CGColor
        }
    
    }
    

    基于基础 CALayer 但很容易翻译回 UIView .

        4
  •  2
  •   0x90    15 年前

    修正了一些小错误

    - (UIImage *)imageForView:(UIView *)view {
        UIGraphicsBeginImageContext(view.frame.size);
        [view.layer renderInContext: UIGraphicsGetCurrentContext()];
        UIImage *retval = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return retval;
    }
    

    此外,添加

    #import <QuartzCore/QuartzCore.h>  
    

    以避免警告消息。

    将代码与找到的代码组合在一起 here 完美无瑕。