xyz hexadecimal from convert color iphone uiview colors pixel

iphone - hexadecimal - ¿Cómo obtener el color de un píxel en una UIView?



uicolor ios (4)

Estoy tratando de desarrollar una pequeña aplicación. En él, necesito detectar el color de un píxel dentro de una UIView. Tengo un CGPoint que define el píxel que necesito. Los colores de UIView se cambian con CoreAnimation.

Sé que hay algunas formas complejas de extraer información de color de UIImages. Sin embargo, no pude encontrar una solución para UIViews.

En Pseudo-Code, estoy buscando algo así como

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

Cualquier entrada muy apreciada.


Aquí hay una solución más eficiente:

// 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

Enlace a archivos: https://github.com/ivanzoid/ikit/tree/master/UIView+ColorOfPoint


Es bastante horrible y lento. Básicamente se crea un contexto de mapa de bits con un almacén de respaldo que se asigna para que pueda leer la memoria, luego se renderiza la capa de vistas en el contexto y se lee el punto apropiado en ram.

Si ya sabes cómo hacerlo para una imagen, puedes hacer algo como esto:

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

Y luego obtendrá una imagen donde puede obtener los datos de píxeles. Estoy seguro de que el mecanismo que tiene para tratar con las imágenes implica pasarlas a un contexto de todos modos, por lo que puede fusionar eso con esto y factorizar la creación de la imagen real. Entonces, si tomas eso, puedes eliminar el bit donde cargas la imagen y reemplazarla con el renderizado de contexto:

[view.layer renderInContext: UIGraphicsGetCurrentContext()];

deberías ser bueno.


Se corrigieron algunos errores menores

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

Además, agrega

#import <QuartzCore/QuartzCore.h>

a su archivo para evitar mensajes de advertencia.

Combinar tu código con el código que se encuentra here funciona a la perfección.


Una versión rápida de la respuesta de ivanzoid

Swift 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 } }

Swift 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 } }

basado en el CALayer subyacente pero fácilmente traducible a UIView .