iOS с открытым исходным кодом для редактирования изображений - или просто несколько советов - PullRequest
5 голосов
/ 22 июня 2011

Для приложения ios, которое я пишу, я хотел бы сделать фотографию из библиотеки фотографий, а затем позволить пользователю «очистить ее», по существу удалив ненужные части.Например, предположим, что пользователь выбирает фотографию человека, моему приложению нужна только голова, а все остальное должно быть удалено, поэтому пользователю необходимо очистить фотографию, удалив фон, тело или других людей на фотографии.Представьте себе фотошоп как опыт, но только с одним инструментом - ластиком.

Я ищу библиотеки с открытым исходным кодом или примеры или просто советы о том, как начать работу с этим.

Я знаю, как использовать UIImagePickerController для выбора изображения, чтобы отсутствующая часть была фактическим редактированием.Как полный новичок, я был бы рад получить несколько советов о том, что было бы разумным подходом к этому, предпочтительно с некоторым примером кода или даже многоразовой библиотекой.

Полагаю, на высоком уровне я хочу начать с прямоугольного изображения и убедиться, что у него есть альфа-слой, а затем, когда пользователь касается частей изображения, чтобы удалить их, мне нужно«удалить» больше пикселей из изображения, изменив их альфа-уровень на 0. Но это слишком высокоуровневое описание, которое я даже не уверен, что правильно ... Другое разумное требование - отменить поддержку.

Другой подход, который приходит на ум, заключается в использовании исходного изображения и маскирующего изображения, которое пользователь редактирует, касаясь экрана, и когда «готово», каким-то образом скомпилируйте два изображения в одно изображение с альфа-каналом.Конечно, это деталь реализации, и пользователю не нужно знать, что на экране есть два изображения.

Если возможно, я бы хотел остаться на уровнях UIImage или UIImageView или Core Graphics и не иметьсвязываться с OpenGL ES.У меня такое ощущение, что более высокие графические уровни должны быть достаточно производительными и легкими для понимания, удобство сопровождения чистого кода - это вопрос ...

Любой совет приветствуется, спасибо!

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

Это оказалось довольно легко, спасибо за указатели @ Rog.
Я вставлю свое решение ниже. Это идет в коде контроллера:

#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];
  }
}
0 голосов
/ 22 июня 2011

Вам нужно будет хорошо познакомиться с Quartz 2D / CoreGraphics. Это руководство - хорошее начало для вас http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html

Задача, которую вы описали, может быть простой или сложной, как вы хотите. От того, чтобы позволить пользователю использовать свои пальцы, чтобы стереть область вокруг фотографии, перетаскивая его пальцем (легко), вы пытаетесь обнаружить высококонтрастные области, которые помогут вам угадать, где вырезать (довольно сложно).

Если вы выберете первое, вам, по сути, потребуется создать обтравочную маску на основе пользовательских прикосновений, поэтому взгляните на методы touchesBegan, touchesMoved и touchesEnded в UIView.

Для маски отсечения, это, вероятно, хороший простой пример для начала Как стереть часть UIImage

Удачи вам, это звучит как забавный (если не сложный) проект.

...