使用 Swift 为核心图像过滤器添加价值

Posted

技术标签:

【中文标题】使用 Swift 为核心图像过滤器添加价值【英文标题】:Add Value to Core Image Filter using Swift 【发布时间】:2021-05-25 14:24:01 【问题描述】:

我正在使用 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, 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

【问题讨论】:

【参考方案1】:

常量kCIInputIntensityKey 映射到"inputIntensity",但您想设置"inputEdgeIntensity"。你应该可以这样做:

filter?.setValue(CGFloat(intensity), forKey: "inputEdgeIntensity")

(并非每个过滤器参数名称都有对应的kCIInput... 常量。)

【讨论】:

感谢弗兰克,请忽略我之前的评论,现已删除。我错误地尝试将您的修复应用于错误的过滤器。感谢您的帮助。

以上是关于使用 Swift 为核心图像过滤器添加价值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift 过滤 UISearchBar 的核心数据

如何在 iOS Swift 中过滤 JSON 并获取价值?

核心图像:使用 CICrop 后,应用合成过滤器不对齐

核心图像过滤器崩溃问题

可以应用哪些核心图像过滤器来改善文本文档的图像?

将时间变量添加到过滤器(Swift)