我使用CIImage向图像添加了许多不同的过滤器类型。所有过滤器的默认值都很好,而且CIPixellate和CICrystallize过滤器使用的是kCIInputScaleKey和kCIInputRadiusKey值。但是,我在为CILineOverlay过滤器添加值时遇到了问题。我想为inputEdgeIntensity提供一个特定的值。核心图像过滤器参考文档状态:
inputEdgeIntensity:一个NSNumber对象,其属性类型为CIAttributeTypeScalar,其显示名称为边缘强度。
默认值: 1.00
但是,我在任何地方都找不到一个例子,说明如何使用斯威夫特来增加这个价值。使用此代码不起作用:
filter?.setValue(CGFloat(intensity), forKey: kCIInputIntensityKey)有谁能帮助我使用Swift为CILineOverlay指定一个CILineOverlay标量值的正确格式/语法?
谢谢
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, Float)] = [
// Effect type, effect display name,
// default intensity setting, show slider?,
// min slider value, max slider value
(.none, "None", 0, false, 0, 0),
(.comic, "Comic", 0, false, 0, 0),
(.crystallize, "Crystallize", 30, true, 10, 100),
(.lineOverlay, "Line", 0, false, 0, 0),
(.pixellate, "Pixellate", 30, true, 10, 100),
(.poster, "Poster", 0, false, 0, 0),
(.spotColor, "Spot Color", 0, false, 0, 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
}发布于 2021-05-25 14:34:25
常量kCIInputIntensityKey映射到"inputIntensity",但希望设置"inputEdgeIntensity"。你应该可以这样做:
filter?.setValue(CGFloat(intensity), forKey: "inputEdgeIntensity")(并不是每个过滤器参数名称都有相应的kCIInput...常量。)
https://stackoverflow.com/questions/67689974
复制相似问题