2011-06-22 16 views
5

Para una aplicación ios que estoy escribiendo, me gustaría tomar una foto de la biblioteca de fotos y luego dejar que el usuario "la limpie", borrando básicamente partes de eso no es necesario. Por ejemplo, supongamos que el usuario elige una foto de una persona, mi aplicación solo necesita la cabeza y todo lo demás debe eliminarse para que el usuario tenga que limpiar la foto eliminando el fondo, el cuerpo u otras personas en la foto. Imagine una experiencia de Photoshop pero con solo una herramienta: el borrador.iOS biblioteca de edición de código abierto de edición de imágenes o solo algunos consejos

Estoy buscando bibliotecas de código abierto, o ejemplos o solo consejos sobre cómo empezar con eso.

Sé cómo usar un UIImagePickerController para seleccionar una imagen, por lo que la parte que falta es la edición real. Como novato completo, me gustaría obtener algunos consejos sobre lo que sería un enfoque razonable para esto, preferiblemente con algún código de muestra o incluso una biblioteca reutilizable.

Supongo que, en un nivel alto, lo que quiero hacer es comenzar con una imagen rectangular y asegurarme de que tiene una capa alfa y luego, cuando el usuario toca partes de la imagen para eliminarlas, necesito "eliminar "más píxeles de la imagen cambiando su nivel alfa a 0. Pero esa es una descripción de nivel demasiado alto que ni siquiera estoy seguro de que sea correcta ... Otro requisito razonable es el soporte de deshacer.

Otro enfoque que se le viene a la mente es usar la imagen original y una imagen de máscara que el usuario edita mientras toca la pantalla y cuando se hace "de alguna manera" compila las dos imágenes en una imagen con alfa. Por supuesto, este es un detalle de implementación y el usuario no necesita saber que hay dos imágenes en la pantalla.

Si es posible, me gustaría permanecer en los niveles UIImage o UIImageView o Core Graphics y no tener que meterme con OpenGL ES. Mi intuición es que los niveles de gráficos más altos deben ser lo suficientemente eficaces y fáciles de entender, el código limpio que se puede mantener es una consideración ...

Cualquier consejo es apreciado, gracias!

Respuesta

0

Tendrá que familiarizarse con Quartz 2D/CoreGraphics. Esta guía es un buen comienzo para usted http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html

La tarea que ha descrito puede ser tan simple o tan complicada como desee. Desde dejar que el usuario use sus dedos para borrar el área alrededor de la foto arrastrando su dedo (fácil) hasta usted tratando de detectar áreas de alto contraste que lo ayudan a adivinar dónde cortar (bastante complicado).

Si elige la primera, básicamente querrá crear una máscara de recorte basada en los toques del usuario, así que eche un vistazo a los métodos touBegan, touchesMoved y touchesEnded de UIView.

Para la máscara de recorte, esto es probablemente un buen ejemplo sencillo para empezar How erase part of UIImage

Buena suerte con ella, suena como un divertido (si no es un reto) proyecto.

+0

¡Gracias por la respuesta rápida! Estoy mirando los enlaces que ha publicado, particularmente esto es muy útil http://stackoverflow.com/questions/1487601/how-to-erase-some-portion-of-uiimageviews-image-in-iphone pero yo Dejaremos la respuesta como "no aceptada" por unos días más para dejar que la gente publique más respuestas y, con suerte, incluso una biblioteca que haga exactamente eso (escasas posibilidades). ¡Gracias! – Ran

4

Esto resultó ser bastante fácil, gracias a los indicadores de @Rog.
Pegaré mi solución a continuación. Esto va en el código del controlador:

#pragma mark - touches 

- (void) clipImageCircle:(CGPoint)point radius:(CGFloat)radius { 
    UIBezierPath* uiBezierPath = [UIBezierPath bezierPathWithArcCenter:point radius:radius startAngle:0 endAngle:2 * M_PI clockwise:NO]; 
    CGPathRef erasePath = uiBezierPath.CGPath; 
    UIImage *img = imageView.image; 
    CGSize s = img.size; 
    UIGraphicsBeginImageContext(s); 
    CGContextRef g = UIGraphicsGetCurrentContext(); 
    CGContextAddPath(g, erasePath); 
    CGContextAddRect(g,CGRectMake(0, 0, s.width, s.height)); 
    CGContextEOClip(g); 
    [img drawAtPoint:CGPointZero]; 
    imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

- (void) receiveTouch:(CGPoint)point { 
    NSLog(@"%@", NSStringFromCGPoint(point)); 
    [self clipImageCircle:point radius:20]; 
} 

- (void) endTouch { 
    NSLog(@"END TOUCH"); 
} 

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    // We currently support only single touch events 
    UITouch* touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:imageView]; 
    if ([imageView hitTest:point withEvent:event]) { 
    [self receiveTouch:point]; 
    } 
} 

- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self endTouch]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self endTouch]; 
} 

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch* touch = [touches anyObject]; 
    CGPoint point = [touch locationInView:imageView]; 
    if ([imageView hitTest:point withEvent:event]) { 
    [self receiveTouch:point]; 
    } 
} 
Cuestiones relacionadas