将边框应用于图像形状

时间:2014-01-29 10:18:27

标签: ios image image-processing border

在我的应用程序中,我有各种不同形状的图像。像树,云。 (附上样本图像)。 我想以编程方式为这些形状添加边框。就像图像是树,然后需要突出树形状。 我不能使用calayer,因为它会将边框应用于UIImageView。 任何人都可以指导我如何实现这一目标吗?

sample image

4 个答案:

答案 0 :(得分:2)

简单的选择是将图像绘制两次,首先应用小比例来稍微增大图像。如果图像不透明(但是黑色和白色),则屏蔽。

答案 1 :(得分:2)

我做了同样的事情,但是带有白色边框。我创造了一个白色的身体和外围4px黑色笔触的面具,为我提供了我想要的目标图像周围的均匀边框。以下内容利用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]]];

答案 2 :(得分:1)

您可以使用OpenCV框架将边框应用于图像中的对象。

检查此链接。这里检测到图像的边缘并对其应用边界。我希望这能给出你想要的确切想法。

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

答案 3 :(得分:0)

这可以通过使用一系列 CIFilter 来实现。 See images corresponding to steps below。在我的示例中,基本图像是具有透明背景的彩色图像,蒙版是黑白图像。

  1. 使用 CIEdges 从掩码中检测边缘。

  2. 然后通过应用磁盘最大过滤器 (CIMorphologyMaximum) 使边缘更粗。

  3. 使用 CIMaskToAlpha

    将边框图像从黑白转换为透明和白色
  4. 在边框顶部覆盖原始图像。

完整代码如下:

let base = CIImage(cgImage: baseImage.cgImage!)
let mask = CIImage(cgImage: maskImage.cgImage!)
        
// 1
let edges = mask.applyingFilter("CIEdges", parameters: [
   kCIInputIntensityKey: 1.0
])
    
// 2    
let borderWidth = 0.02 * min(baseImage.size.width, baseImage.size.height)
let wideEdges = edges.applyingFilter("CIMorphologyMaximum", parameters: [
    kCIInputRadiusKey: borderWidth
])
        
// 3
let background = wideEdges.applyingFilter("CIMaskToAlpha")
      
// 4  
let composited = base.composited(over: background)
        
// Convert back to UIImage
let context = CIContext(options: nil)
let cgImageRef = context.createCGImage(composited, from: composited.extent)!
return UIImage(cgImage: cgImageRef)