área dibujada en UIImage no se reconoce correctamente

Estoy teniendo un problema extraño en mi proyecto. Lo que quiero hacer es que un usuario pinte o dibuje utilizando deslizar sobre una image como superposition y solo necesito recortar el área de la image que está debajo de la región pintada. Mi código funciona bien solo cuando la vista UIImage que está debajo de la región de pintura tiene 320 píxeles de ancho, es decir, el ancho del iPhone. Pero si cambio el ancho de ImageView , no obtendré el resultado deseado.

Estoy usando el siguiente código para build una CGRect alnetworkingedor de la parte pintada.

 -(CGRect)detectRectForFaceInImage:(UIImage *)image{ int l,r,t,b; l = r = t = b = 0; CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)); const UInt8* data = CFDataGetBytePtr(pixelData); BOOL pixelFound = NO; for (int i = leftX ; i < rightX; i++) { for (int j = topY; j < bottomY + 20; j++) { int pixelInfo = ((image.size.width * j) + i ) * 4; UInt8 alpha = data[pixelInfo + 2]; if (alpha) { NSLog(@"Left %d", alpha); l = i; pixelFound = YES; break; } } if(pixelFound) break; } pixelFound = NO; for (int i = rightX ; i >= l; i--) { for (int j = topY; j < bottomY ; j++) { int pixelInfo = ((image.size.width * j) + i ) * 4; UInt8 alpha = data[pixelInfo + 2]; if (alpha) { NSLog(@"Right %d", alpha); r = i; pixelFound = YES; break; } } if(pixelFound) break; } pixelFound = NO; for (int i = topY ; i < bottomY ; i++) { for (int j = l; j < r; j++) { int pixelInfo = ((image.size.width * i) + j ) * 4; UInt8 alpha = data[pixelInfo + 2]; if (alpha) { NSLog(@"Top %d", alpha); t = i; pixelFound = YES; break; } } if(pixelFound) break; } pixelFound = NO; for (int i = bottomY ; i >= t; i--) { for (int j = l; j < r; j++) { int pixelInfo = ((image.size.width * i) + j ) * 4; UInt8 alpha = data[pixelInfo + 2]; if (alpha) { NSLog(@"Bottom %d", alpha); b = i; pixelFound = YES; break; } } if(pixelFound) break; } CFRelease(pixelData); return CGRectMake(l, t, r - l, bt); } 

En el código anterior, la izquierda X, la derecha X, la superior Y la inferior Y son los valores extremos (de CGPoint ) en el flotador que se calcula cuando el usuario desliza el dedo sobre la pantalla mientras pintan y representa un rectángulo que contiene el área pintada en sus límites (para minimizar loop).

  leftX - minimum in X-axis rightX - maximum in X-axis topY - min in Y-axis bottom - max in Y-axis 

Aquí l, r, t, b son los valores calculados para el rectángulo real.

Como se expresó anteriormente, este código funciona bien cuando la vista de image en la que se hace el dolor es de 320 píxeles de ancho y se extiende a lo largo del ancho de la pantalla. Pero si el ancho de la image es más pequeño como 300 y se coloca en el centro de la pantalla, el código da un resultado falso.

Nota: Estoy escalando la image según el ancho de la image.

A continuación se muestra la salida NSLog :

  1. Cuando el ancho de imageview es de 320 píxeles (Estos son valores para el componente de color en píxeles coincidentes o píxeles no transparentes):

     2013-05-17 17:58:17.170 FunFace[12103:907] Left 41 2013-05-17 17:58:17.172 FunFace[12103:907] Right 1 2013-05-17 17:58:17.173 FunFace[12103:907] Top 73 2013-05-17 17:58:17.174 FunFace[12103:907] Bottom 12 
  2. Cuando el ancho de imageview es de 300 píxeles:

     2013-05-17 17:55:26.066 FunFace[12086:907] Left 42 2013-05-17 17:55:26.067 FunFace[12086:907] Right 255 2013-05-17 17:55:26.069 FunFace[12086:907] Top 42 2013-05-17 17:55:26.071 FunFace[12086:907] Bottom 255 

¿Cómo puedo resolver este problema porque necesito la vista de imágenes en el centro con relleno a ambos lados.

EDIT: Ok, parece que mi problema se debe a la orientación de la image de las imágenes JPEG (de la camera). Las imágenes Png funcionan bien y no se ven afectadas por el cambio en el ancho de la image. Pero aún los files JPEG no funcionan incluso si manejo la orientación.

Primero, me pregunto si está accediendo a algo que no sea RGBA de 32 bits. El valor del índice para los datos [] se almacena en pixelInfo luego mueve +2 bytes, en lugar de +3. Eso te aterrizaría en el byte azul. Si su intención es usar RGBA, ese hecho afectaría el rest de los resultados de su código.

Continuando, con la suposition de que todavía obtienes resultados defectuosos a pesar de tener el valor del componente alfa correcto, parece que tu código "fijo" daría salidas NSLog Izquierda, Derecha, Superior e Inferior con valores alfa menores que 255, algo cercano a 0. En este caso, sin más código, sugeriría que su problema está dentro del código que usa para networkingucir la escala de la image de su fuente 320×240 a 300×225 (o tal vez a cualquier otra dimensión escalada). Podría imaginar que su image tiene valores alfa en el borde de 255 si su código de "escala" está realizando un recorte en lugar de una escala.