在我的应用程序中,我有各种不同形状的图像,比如树、云(示例图像附在下面)。我想通过编程方式为这些形状添加边框。比如如果图像是树,则需要突出显示树形状。由于使用 calayer 会将边框应用到 UIImageView 上,所以我不能使用它。请问有人能指导我如何实现吗?
CIEdges
从掩模中检测边缘。CIMorphologyMaximum
)使边缘变粗。CIMaskToAlpha
将边框图像从黑白转换为透明和白色。完整代码如下:
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)
我刚刚做了同样的事情,但是加上了白色边框。我创建了一个带有白色主体和4像素黑色描边的遮罩,以便在目标图像周围获得我想要的统一边框。以下利用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]]];
bezierPathWithRoundedRect
来定义半径为图片直径的 1/2 的贝塞尔路径中绘制图像。有一个路径可以很容易地描边以得到一致的边框。你的遮罩始终相同吗?如果是这样,将其定义为贝塞尔路径-可以使用基本形状硬编码坐标,或从 SVG 导入。路径使事情更加容易。 - greg