2011-06-22 17 views
5

Dla aplikacji ios, którą piszę, chciałbym zrobić zdjęcie z biblioteki zdjęć, a następnie pozwolić użytkownikowi "wyczyścić", zasadniczo usuwając części to nie jest potrzebne. Załóżmy na przykład, że użytkownik wybiera zdjęcie osoby, moja aplikacja potrzebuje tylko głowy, a wszystko inne powinno zostać usunięte, aby użytkownik wyczyścił zdjęcie, usuwając tło, ciało lub inne osoby na zdjęciu. Wyobraź sobie, że przypominasz photoshopa, ale z jednym tylko narzędziem - gumką.iOS Edycja grafiki biblioteki otwartego źródła - lub tylko kilka wskazówek

Szukam bibliotek open source, lub przykładów lub tylko wskazówek, jak zacząć z tym.

Wiem, jak użyć kontrolera UIImagePickerController do wybrania obrazu, więc brakująca część to rzeczywista edycja. Jako kompletny noob chętnie doradziłbym, co byłoby rozsądnym podejściem do tego, najlepiej przy pomocy przykładowego kodu lub biblioteki wielokrotnego użytku.

Przypuszczam, że na wysokim poziomie, co chcę zrobić, zacznij od prostokątnego obrazu i upewnij się, że ma warstwę alfa, a następnie, gdy użytkownik dotknie części obrazu, aby je usunąć, muszę "usunąć" "więcej pikseli z obrazu zmieniając ich poziom alfa na 0. Ale to opis zbyt wysokiego poziomu, którego nie jestem nawet pewien jest poprawny ... Kolejnym rozsądnym wymaganiem jest cofnięcie wsparcia.

Innym podejściem, które przychodzi na myśl, jest użycie oryginalnego obrazu i obrazu maski, który użytkownik edytuje dotykając ekranu, a kiedy "zrobione", w jakiś sposób skompilować dwa obrazy do jednego obrazu z alfą. Oczywiście jest to szczegół implementacji i użytkownik nie musi wiedzieć, że na ekranie są dwa obrazy.

Jeśli to możliwe, chciałbym pozostać na poziomach UIImage lub UIImageView lub Core Graphics i nie musieć mieszać z OpenGL ES. Mam przeczucie, że wyższe poziomy grafiki powinny być wystarczająco wydajne i łatwe do zrozumienia, rozważny jest czysty kod ...

Każda rada jest doceniana, dziękuję!

Odpowiedz

0

Będziesz musiał dobrze zaznajomić się z Quartz 2D/CoreGraphics. Ta instrukcja to dobry początek. http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html

Zadanie, które opisałeś, może być tak proste lub tak skomplikowane, jak chcesz. Od czasu, gdy użytkownik użyje palców, aby wymazać obszar wokół zdjęcia, przeciągając palcem (łatwo) do Ciebie, próbując wykryć obszary o wysokim kontraście, które pomogą Ci odgadnąć gdzie cię wyciąć (dość skomplikowane).

Jeśli wybierzesz ten pierwszy, zasadniczo będziesz chciał utworzyć maskę przycinającą opartą na dotknięciach użytkownika, więc spójrz na dotknięcia, dotknięcia i wybrane metody UIView.

Dla maski odcinania, jest to chyba dobry prosty przykład, aby zacząć How erase part of UIImage

powodzenia z tym, to brzmi jak zabawa (jeśli nie jest trudne) projekt.

+0

Dzięki za szybką odpowiedź! Sprawdzam opublikowane przez Ciebie linki, w szczególności bardzo pomocne http://stackoverflow.com/questions/1487601/how-to-erase-some-portion-of-uiimageviews-image-in-iphone, ale ja "Zostawię odpowiedź" jako "nie zaakceptowaną" na kilka kolejnych dni, aby ludzie mogli wysyłać więcej odpowiedzi i mam nadzieję, że może nawet biblioteka, która to robi (mała szansa). Dzięki! – Ran

4

Okazało się to całkiem łatwe, dzięki za wskazówki @Rara.
Wkleję moje rozwiązanie poniżej. To jest w kodzie sterownika:

#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]; 
    } 
}