【发布时间】:2015-11-05 19:53:31
【问题描述】:
我在UIScrollView 中有一个UIImage,可以从一端滚动到另一端。假设左边是 0.0%,右边是 100.0%。
UIImage 是 RGB 范围内的彩色图像,我想根据滚动位置逐渐变为灰度。
我对此进行了研究,但找不到任何逐渐改变它的答案。显然,一次以光线比例渲染它是可能的。
有没有可能在 Swift 中做到这一点?
编辑
感谢 Duncan 提供技术上正确的答案。这确实有效,但不幸的是它在滚动时会滞后。这就是为什么我使用 Joerns 解决方案将两张图像放在彼此上方(一张彩色图像和一张灰度图像)并相应地更改 alpha 值。 如果有人想要 Duncans 建议的代码,请点击此处:
if let image = image
{
let icon = CIImage(CGImage: image)
if let filter = CIFilter(name: "CIColorControls")
{
filter.setValue(icon, forKey: kCIInputImageKey)
filter.setValue(0.0, forKey: kCIInputSaturationKey)
if let ciImage = filter.outputImage
{
let context = CIContext(options:nil)
let cgImage = context.createCGImage(ciImage, fromRect: ciImage.extent)
imageView.image = UIImage(CIImage: cgImage)
}
}
}
【问题讨论】:
-
你能解释一下根据滚动位置改变它的意思吗?您是希望图像的饱和度从左到右逐渐变化,还是希望图像的整个可见部分使用一个随滚动位置而变化的饱和度值?我的回答假设您想要从左到右改变饱和度。西蒙的回答会让你根据滚动位置改变整个当前可见区域的饱和度。
-
@DuncanC 查看我上面的编辑
-
@freshking 您可以使用 CGColorSpaceCreateDeviceGray 创建上下文并在其上绘制图像。这将比过滤器快 10 倍。在我的机器 0.07121700048446655 对 0.6915000081062317 使用 CIColorControls
标签: swift uiimage swift2 rgb grayscale