首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用Swift实现核心图像滤波器的增值

利用Swift实现核心图像滤波器的增值
EN

Stack Overflow用户
提问于 2021-05-25 14:24:01
回答 1查看 280关注 0票数 0

我使用CIImage向图像添加了许多不同的过滤器类型。所有过滤器的默认值都很好,而且CIPixellate和CICrystallize过滤器使用的是kCIInputScaleKey和kCIInputRadiusKey值。但是,我在为CILineOverlay过滤器添加值时遇到了问题。我想为inputEdgeIntensity提供一个特定的值。核心图像过滤器参考文档状态:

inputEdgeIntensity:一个NSNumber对象,其属性类型为CIAttributeTypeScalar,其显示名称为边缘强度。

默认值: 1.00

但是,我在任何地方都找不到一个例子,说明如何使用斯威夫特来增加这个价值。使用此代码不起作用:

代码语言:javascript
复制
filter?.setValue(CGFloat(intensity), forKey: kCIInputIntensityKey)

有谁能帮助我使用Swift为CILineOverlay指定一个CILineOverlay标量值的正确格式/语法?

谢谢

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-25 14:34:25

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

代码语言:javascript
复制
filter?.setValue(CGFloat(intensity), forKey: "inputEdgeIntensity")

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67689974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档