2014-01-29 4 views
5

В моем приложении у меня есть различные изображения разных форм. Как дерево, облако. (Образец прилагается). Я хочу добавить границу для этих фигур программически. Например, если изображение имеет дерево, тогда необходимо выделить форму дерева. Я не могу использовать calayer, поскольку он применит границу к UIImageView. Может ли кто-нибудь вести меня, как достичь этого?Применение формы границы к изображению

sample image

+0

Нарисуйте изображение дважды, сначала с нанесенной шкалой. Маскирование, если изображения не прозрачны (но черно-белые). – Wain

+0

Вы хотите границу всегда или выбранный режим – codercat

+0

Я хочу, чтобы граница всегда со случайным цветом. –

ответ

2

Простой вариант нарисовать изображение дважды, сначала в небольшом масштабе прикладного расти изображения немного. Маскирование, если изображения не прозрачны (но черные & белые).

+1

Это изящно, но проблема в том, что граница не будет одинаковой по всей форме. Он будет ближе ближе к центру. Ответ на обнаружение края, вероятно, более перспективен, хотя и сложнее вычислить. – Rob

+0

@Rob: Спасибо за ваши отзывы, но моя форма не является постоянной или такой же. Это может быть дерево, многоугольник, квадрат, зонтик, так что, пожалуйста, дайте мне знать, есть ли какое-либо общее решение для этого, поскольку форма может быть любой. –

+0

@PoojaManiklalBohora Это была моя точка зрения. Вот почему я, хотя это заманчиво простое решение не сработает для вас. – Rob

1

Вы можете применить границу для объектов, присутствующих в изображении, используя структуру OpenCV.

Проверьте эту ссылку. Здесь ребра обнаруживаются с изображением, и к нему применяется граница. Надеюсь, это даст точную идею, которую вы хотите.

https://github.com/BloodAxe/OpenCV-Tutorial

+0

Спасибо, но это не так, как я хочу. –

2

Я просто сделал то же самое, но с белой рамкой. Я создал маску с белым телом и черным штрихом 4px снаружи, чтобы дать мне единую границу, которую я хочу вокруг своего целевого изображения. В followng используются фильтры Core Image для маскировки сплошного цветного фона (для использования в качестве границы), а затем для маскировки и компоновки целевого изображения.

// The two-tone mask image 
UIImage *maskImage = [UIImage imageNamed: @"Mask"]; 

// Create a filler image of whatever color we want the border to be (in my case white) 
UIGraphicsBeginImageContextWithOptions(maskImage.size, NO, maskImage.scale); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetFillColorWithColor(context, UIColor.whiteColor.CGColor); 
CGContextFillRect(context, CGRectMake(0.f, 0.f, maskImage.size.width, maskImage.size.height)); 
UIImage *whiteImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Use CoreImage to mask the colored background to the mask (the entire opaque region of the mask) 
CIContext *ciContext = [CIContext contextWithOptions: nil]; 
CIFilter *filter = [CIFilter filterWithName: @"CIBlendWithAlphaMask"]; 
[filter setValue: [CIImage imageWithCGImage: whiteImage.CGImage] 
      forKey: kCIInputImageKey]; 
[filter setValue: [CIImage imageWithCGImage: maskImage.CGImage] 
      forKey: kCIInputMaskImageKey]; 

CIImage *whiteBackground = filter.outputImage; 

// scale the target image to the size of the mask (accounting for image scale) 
// ** Uses NYXImageKit 
image = [image scaleToSize: CGSizeMake(maskImage.size.width * maskImage.scale, maskImage.size.height * maskImage.scale) 
       usingMode: NYXResizeModeAspectFill]; 

// finally use Core Image to create our image using the masked white from above for our border and the inner (white) area of our mask image to mask the target image before compositing 
filter = [CIFilter filterWithName: @"CIBlendWithMask"]; 
[filter setValue: [CIImage imageWithCGImage: image.CGImage] 
      forKey: kCIInputImageKey]; 
[filter setValue: whiteBackground 
      forKey: kCIInputBackgroundImageKey]; 
[filter setValue: [CIImage imageWithCGImage: maskImage.CGImage] 
      forKey: kCIInputMaskImageKey]; 

image = [UIImage imageWithCGImage: [ciContext createCGImage: filter.outputImage 
                fromRect: [filter.outputImage extent]]]; 
Смежные вопросы