2012-03-04 11 views
9

Estoy tratando de determinar si un CGPoint se encuentra dentro de la forma de una imagen. La imagen es una forma negra simple como las dos que se adjuntan a continuación. Me gustaría crear un método que determine si un CGPoint se encuentra o no dentro del área negra de esa forma.Determine si CGPoint está dentro del área de la imagen

Creo que esto necesita dos cosas: 1) Al girar la imagen en algo que se pueden leer con código (no estoy seguro de qué tipo de procesamiento de imágenes esto sería usar o cómo)

2) Usando esto como una referencia para determinar si un CGPoint se encuentra o no dentro de él.

Cualquier ayuda o ideas apreciadas. Nunca antes he hecho un tipo de codificación de procesamiento de imágenes. ¡Gracias!

enter image description here

+4

Puede crear un 'CGBitmapContext' respaldado por los datos que controla, en el formato que elija. Puede convertirlo en un contexto de 1x1, establecer la CTM de modo que el punto que desea probar se encuentre justo en el origen y dibujar su imagen en el contexto. Luego prueba tus datos para ver si tienes un píxel negro o un píxel blanco. –

+2

@Kevin Ballard: ¿Por qué no proporcionar eso como respuesta? Suena como una solución. – DarkDust

+1

@DarkDust: Porque no quería tomarme el tiempo para escribir un código. –

Respuesta

11

Tome un vistazo a Ole Begemann de OBShapedButton. Allí encontrará una categoría UIImage que contiene el método ColorAtPixel. Supongo que eso es lo que estás buscando.

entonces se puede obtener cierta UIColor de píxeles con:

UIImage *image = [UIImage imageWithCGImage:yourCGImage]; 
CGPoint point = CGPointMake(pointx,pointy); 
UIColor *pixelColor = [image colorAtPixel:point]; 

Para simplificar valores RGB que consiguen también se puede echar un vistazo a uicolor-utilities. Utilizando la categoría UIColor-Expanded, puede simplemente determinar, digamos, el componente rojo y azul. Si son bajos (el píxel es oscuro), entonces el punto probado está dentro de la forma.

CGFloat redComp = [pixelColor red]; 
CGFloat blueComp = [pixelColor blue]; 

BOOL isInsideShape = ((redComp < 0.5) && (blueComp < 0.5)); 
+1

¡Guau, gracias por esto! – Mat

Cuestiones relacionadas