将CIRadialGradient应用于我的图像后,其宽度减小了约20%。
guard let image = bgImage.image, let cgimg = image.cgImage else {
print("imageView doesn't have an image!")
return
}
let coreImage = CIImage(cgImage:cgimg)
guard let radialMask = CIFilter(name:"CIRadialGradient") else {
return
}
guard let maskedVariableBlur = CIFilter(name:"CIMaskedVariableBlur") else {
print("CIMaskedVariableBlur does not exist")
return
}
maskedVariableBlur.setValue(coreImage, forKey: kCIInputImageKey)
maskedVariableBlur.setValue(radialMask.outputImage, forKey: "inputMask")
guard let selectivelyFocusedCIImage = maskedVariableBlur.outputImage else {
print("Setting maskedVariableBlur failed")
return
}
bgImage.image = UIImage(ciImage: selectivelyFocusedCIImage)
为明确起见,bgImage
是UIImageView
。
为什么会发生这种情况以及如何解决?
没有RadialMask:
使用RadialMask:
与之不同的是,在我的物理iPhone上,较小的图像向左对齐。
答案 0 :(得分:2)
答案 1 :(得分:2)
我倾向于通过使用CIContext
并创建特定大小的CGImage而不是简单地使用UIImage(ciImage:)
来明确声明图像的大小。假设您的inputImage被称为coreGraphics
,请尝试以下操作:
let ciCtx = CIContext()
let cgiig = ctx.createCGImage(selectivelyFocusedCIImage, from: coreImage.extent)
let uiImage = UIImage(cgImage: cgIMG!)
一些注意事项......
(1)我从要包装的应用程序中提取了此代码。这是未经测试的代码(包括强制展开),但是我正在做的事情的概念很可靠。
(2)您没有解释很多您想做的事情,但是当我看到一个名为selectivelyFocusedCIImage
的变量时,我担心您可能试图以比其他方式更具交互性的方式使用CoreImage。 “只是”创建一个图像。如果要“近乎实时”的性能,请使用(GLKView
(从iOS 12起不推荐使用)或MTKView
(而不是UIImageView
)渲染CIImage。后者仅使用CPU,而前两者则使用GPU。
(3)最后,对CIContexts
发出警告-创建它们很昂贵!通常,您可以对其进行编码,以使应用程序中的所有内容只能共享一个上下文。
答案 2 :(得分:0)
不同的大小是由模糊滤镜的内核大小引起的:
模糊滤镜需要对每个像素周围的区域进行采样。由于没有超出图像边界的像素,因此Core Image将结果图像的extend
减小内核大小(模糊半径)的一半,以表示这些像素没有足够的信息来进行适当的模糊处理。>
但是,您可以告诉Core Image将边框像素视为在所有方向上都无限延伸,以便模糊滤镜即使在图像边缘也可以获得足够的信息。然后,您可以将结果裁剪回原始尺寸。
在您的代码中,只需更改以下两行:
maskedVariableBlur.setValue(coreImage.clampedToExtent(), forKey: kCIInputImageKey)
bgImage.image = UIImage(ciImage: selectivelyFocusedCIImage.cropped(to:coreImage.extend))