将 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:
使用径向 mask :
不同的是,在我的实体 iPhone 上,较小的图像向左对齐。
最佳答案
我倾向于通过使用 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交互方式,而不是“仅仅”创建一个图像。如果您想要“接近实时”的性能,请在(自 iOS 12 起已弃用)GLKView
或 MTKView
而不是 UIImageView< 中呈现 CIImage/
。后者仅使用 CPU,而前两者使用 GPU。
(3) 最后,关于 CIContexts
的警告——它们的创建成本很高!通常,您可以对其进行编码,以便只有一个上下文可以由您的应用程序中的所有内容共享。
关于ios - CIRadialGradient 减小图像尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53228471/