如何使用 CIColorControls 通过 UISlider 和 Swift 更改亮度、对比度和饱和度

2024-01-19

我正在开发一个照片滤镜应用程序,正如你所看到的,我添加了一个功能来调整对比度、亮度、饱和度和噪音。但问题是它们是独立工作的,这意味着当我开始编辑对比度时调整亮度时,它会返回到原始亮度。

这是当我将亮度设置为最大(图像变白)然后尝试调整其对比度并且滑块更改原始图像的对比度时的预览。

在这里,我能够捕捉到释放滑块并将其值放在原始图像上的时刻,正如您所看到的,它起作用了,在演示中我将饱和度设置为 0,然后将相同饱和度的图片的对比度更改为 0。

Works!.

问题是,现在当我单击滑块而不更改其值时,它会使当前值翻倍。例如,如果我将亮度设置为 5,将饱和度设置为 10,并决定在单击亮度时立即调整亮度,它的值会加倍,我不知道为什么。 这是一个例子。我只是单击滑块而不更改其值。

这是代码

  @objc func sliderValueDidChange(_ sender: UISlider!) {

    if sender.tag == 0 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        brightnessValueLabel.text = ("\(displayinPercentage)")
        selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputBrightnessKey)
        self.filteredImage = self.filter?.outputImage
        selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value


    } else if sender.tag == 1 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        contrastValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputContrastKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    } else if sender.tag == 2 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        saturationValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIColorControls")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(sender.value, forKey: kCIInputSaturationKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    } else if sender.tag == 3 {

        let displayinPercentage: Int = Int((sender.value/200) * 10000)
        sharpenValueLabel.text = ("\(displayinPercentage)")
        self.selectedPictureImageView.image = originalImage
        let beginImage = CIImage(image: self.selectedPictureImageView.image!)
        self.filter = CIFilter(name: "CIUnsharpMask")
        self.filter?.setValue(beginImage, forKey: kCIInputImageKey)
        self.filter.setValue(7, forKey: kCIInputRadiusKey)
        self.filter.setValue(sender.value, forKey: kCIInputIntensityKey)
        self.filteredImage = self.filter?.outputImage
        self.selectedPictureImageView.image = UIImage(cgImage: self.context.createCGImage(self.filteredImage!, from: (self.filteredImage?.extent)!)!)
        sliderValue = sender.value

    }
}

@objc func sliderValueDidEnd(_ sender: UISlider!) {

    if sender.tag == 0 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 1 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 2 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    } else if sender.tag == 3 {
        originalImage = selectedPictureImageView.image
        sender.value = sliderValue
        print("Unpressed button slider value is \(sender.value)")
    }
}

我认为一切正常,我只是对过滤器值进行了错误的计算。


您的问题是,每次滑动滑块时,您都会将滤镜应用于前一个滤镜的结果图像,而不是将其应用于原始图像。顺便说一句,如果您在用户完成操作后创建一个 CGImage,那么在滑动 UISlider 时,您可以使过滤器的响应速度更快。您的代码应如下所示:

let displayinPercentage = Int((sender.value/200) * 10000)
brightnessValueLabel.text = String(displayinPercentage)
let beginImage = CIImage(image: originalImage)
filter.setValue(beginImage, forKey: kCIInputImageKey)
filter.setValue(sender.value, forKey: kCIInputBrightnessKey)
if let ciimage = filter.outputImage {
    filteredImage = ciimage
    selectedPictureImageView.image = UIImage(ciImage: filteredImage)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 CIColorControls 通过 UISlider 和 Swift 更改亮度、对比度和饱和度 的相关文章

随机推荐

  • 可靠地验证 JWS 证书链和域

    我正在 Node JS 中编写后端代码来验证来自 Google SafetyNet API 的 JWS 我很惊讶没有为此找到现成的模块 因此我开始使用可用的库来研究 JWS 的一些简单验证 首先 谷歌表示需要执行以下步骤 从 JWS 消息中
  • 如何在Windows服务器上运行html文件中的php代码?

    我已使用 htaccess 文件和以下代码AddType 应用程序 x httpd php html htm 它在本地工作正常 但当我将文件上传到服务器上时 它工作不正常 我的所有页面都有 html 扩展名 您需要添加到 PHP exe 的
  • 递归泛型类型

    是否可以在 C 中定义引用自身的泛型类型 例如 我想定义一个 Dictionary 将其类型保存为 TValue 对于层次结构 Dictionary
  • echo 输出与预期的格式化输出不同

    I m using the following formatting for echo 它应该输出粗体和下划线的文本 但不是将其设置为粗体 而是提供 更亮 的颜色变体 并将带下划线的代码 4 视为青色 从而产生浅青色文本 我在 Window
  • 为什么 Enumerator.MoveNext 在与 using 和 async-await 一起使用时不能按我的预期工作?

    我想通过一个枚举List
  • document.title 中的播放符号 (▶) 被压扁

    添加到问题为什么 的 HTML 符号在 document title 中不起作用 https stackoverflow com questions 16930905 why does the html symbol for not wor
  • 使用外部 Python 程序在 OpenOffice 上加载文档

    我正在尝试创建一个 python 程序 使用 pyUNO 来对 OpenOffice 计算表进行一些更改 我之前已在 接受 模式下启动 OpenOffice 以便能够从外部程序进行连接 显然 应该很简单 import uno get the
  • KeyError:

    我一直很难处理烧瓶中的会话 自从我在本地环境中管理应用程序以来 一切都运行良好 包括烧瓶会话 但是当我已经在渲染中托管它时 我总是在每条路线中收到此错误 55 ERROR Error handling request valle de gu
  • 使用 Protractor 检查 DOM 元素中的文本

    这是我在使用 Protractor 测试 Angular 应用程序时尝试做的事情 我想获得某个元素 有点像这样 div class someClass p textFromBoundModel p div 然后获取它的 html 并检查它是
  • 如何在TTabcontrol中隐藏多个选项卡

    我的程序有 3 个下拉菜单和 1 个 ttabcontrol 其中有 5 个选项卡 我需要知道的是 如果下拉菜单选择了特定项目 如何隐藏所有选项卡并再次设置它们的可见性 例如 我的下拉菜单有索引项 A B C A B A C TabCont
  • MySQL 中的数据库注释/描述

    是否可以在 MySQL 中保存有关数据库的额外文本信息 注释 描述等 就像是 SELECT TABLE COMMENT FROM information schema TABLES 但对于数据库 而不是表 不 你不能 Mysql 只允许对表
  • 如何修复获取 URL 时出现的 HTTP 错误。爬行时java中的Status = 500?

    我试图从评论页面抓取用户对 imdb 电影的评分 我的数据库中的电影数量约为 600 000 我使用jsoup来解析页面 如下所示 抱歉 我没有在这里写完整的代码 因为它太长了 try connecting to mysql db Resu
  • Firefox 不会恢复服务器发送的事件连接

    使用Python和CherryPy实现的测试用例 import cherrypy time class Root cherrypy expose def index self return r
  • Ajax 和防止双重“提交”

    我正在处理一个遗留应用程序 他们使用 a 标签来进行许多 Ajax 表单 提交 如果我们使用 input 按钮 我们只需设置 input 标签的禁用属性即可 但在超链接上禁用不是规范的一部分 并且跨浏览器不一致 我们正在寻找一种简单的解决方
  • 在 ViewPager 中实现弹性/弹跳动画效果的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 我想显示一个ViewPager https developer android com reference android support v4 view ViewPager html具有弹跳 弹性滑动效果 我认
  • 谁最初发明了这种类型的语法:-*-编码:utf-8-*-[重复]

    这个问题在这里已经有答案了 Python 将以下内容识别为定义文件编码的指令 coding utf 8 我以前肯定见过这种说明 var value 所以我假设 Python 没有发明它们 也不是唯一使用此类指令的语言 这个语法从何而来 是否
  • 自定义 UITextField 清除按钮

    是否可以自定义清除按钮的图像UITextField 我有一个深色的文本字段背景 x 不够明显 您可以将自己的自定义清除按钮设置为文本字段的rightView财产 确保设置rightViewMode财产给UITextFieldViewMode
  • 使用 Angular 切换列表中的类

    我想在使用 AngularJS 单击元素时切换类 我需要单击的元素来接收类 并需要列表中的任何其他项目来释放类 我已经为此研究了一些假设的解决方案 但是在实施它们时 它们不能正常工作 我不明白为什么它们会这样 建议的一般解决方案是将变量设置
  • C++ 中的不透明值是什么?

    C 中的 不透明值 是什么 不透明 在英语中的定义是 不能被看穿 不透明 在计算机科学中 这意味着除了值本身的类型之外不显示任何细节的值 人们经常使用C型FILE作为经典的例子 但通常这是not不透明 细节显示在stdio h任何人都可以看
  • 如何使用 CIColorControls 通过 UISlider 和 Swift 更改亮度、对比度和饱和度

    我正在开发一个照片滤镜应用程序 正如你所看到的 我添加了一个功能来调整对比度 亮度 饱和度和噪音 但问题是它们是独立工作的 这意味着当我开始编辑对比度时调整亮度时 它会返回到原始亮度 这是当我将亮度设置为最大 图像变白 然后尝试调整其对比度