如何解决使用 Swift 为核心图像过滤器添加值
我正在使用 CIImage 向图像添加许多不同的过滤器类型。所有过滤器在其默认值下都可以正常工作,此外 CIPixellate 和 CICrystallize 过滤器正在分别添加 kCIInputScaleKey 和 kCIInputRadiusKey 值。但是,我无法为 CILineOverlay 过滤器添加值。我想为 inputEdgeIntensity 提供一个特定的值。核心图像过滤器参考文档状态:
输入边缘强度: 一个 NSNumber 对象,其属性类型为 CIAttributeTypeScalar,显示名称为 Edge Intensity。
默认值:1.00
但是我在任何地方都找不到有关如何使用 swift 添加此值的示例。使用此代码不起作用:
filter?.setValue(CGFloat(intensity),forKey: kCIInputIntensityKey)
任何人都可以帮助我使用正确的格式/语法来指定使用 Swift 的 CILineOverlay 的 inputEdgeIntensity 标量值吗?
谢谢
enum ImageEffects: String {
case bloom = "CIBloom"
case chrome = "CIPhotoEffectChrome"
case comic = "CIComicEffect"
case crystallize = "CICrystallize"
case fade = "CIPhotoEffectFade"
case instant = "CIPhotoEffectInstant"
case invert = "CIColorInvert"
case lineOverlay = "CILineOverlay"
case mono = "CIPhotoEffectMono"
case noir = "CIPhotoEffectNoir"
case none = "None"
case pixellate = "CIPixellate"
case poster = "CIColorPosterize"
case process = "CIPhotoEffectProcess"
case sepia = "CISepiaTone"
case spotColor = "CISpotColor"
case tonal = "CIPhotoEffectTonal"
case transfer = "CIPhotoEffectTransfer"
}
let imageEffectsArtistic: [(ImageEffects,String,Float,Bool,Float)] = [
// Effect type,effect display name,// default intensity setting,show slider?,// min slider value,max slider value
(.none,"None",false,0),(.comic,"Comic",(.crystallize,"Crystallize",30,true,10,100),(.lineOverlay,"Line",(.pixellate,"Pixellate",(.poster,"Poster",(.spotColor,"Spot Color",0)
]
if var outputImage = CIImage(image: image) {
let extent = outputImage.extent
let filterList = effect.rawValue.split(separator: ",")
for filterItem in filterList {
let filter = CIFilter(name: String(filterItem))
filter?.setDefaults()
filter?.setValue(outputImage,forKey: kCIInputImageKey)
switch effect {
case .crystallize:
filter?.setValue(CGFloat(intensity),forKey: kCIInputRadiusKey)
case .pixellate:
filter?.setValue(CGFloat(intensity),forKey: kCIInputScaleKey)
default:
()
}
if let newOutputImage = filter?.outputImage {
outputImage = newOutputImage
}
}
let outputCGImage = self.context.createCGImage(outputImage,from: extent)!
imageToReturn = UIImage(cgImage: outputCGImage)
} else {
imageToReturn = image
}
解决方法
常量 kCIInputIntensityKey
映射到 "inputIntensity"
,但您想设置 "inputEdgeIntensity"
。你应该可以这样做:
filter?.setValue(CGFloat(intensity),forKey: "inputEdgeIntensity")
(并非每个过滤器参数名称都有对应的 kCIInput...
常量。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。