ios - 如何将过滤器应用于照片库中的选定图像,而不仅仅是硬编码的图像
问题描述
我正在开发一个照片应用程序,用户可以在其中从照片库中的图像中进行选择,或者他们可以使用相机从应用程序内部拍摄照片。
我有从任一来源获取图像的功能。如果过滤器是用图像名称硬编码的,我可以将过滤器应用于图像,但不能在选择或拍摄它们时应用。
我将如何进行更改,这样我就不需要将图像的名称硬编码到用于将过滤器应用于图像的部分中?
这是我到目前为止关于主题方式的代码。
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
var FilterName:String?
@IBAction func filters(_ sender: UIButton) {
switch sender.tag {
case 1: FilterName = "CIGaussianBlur"
case 2: FilterName = "CIMedianFilter"
case 3: FilterName = "CIEdges"
default: print("No Filter Applied")
}
process()
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
guard let image = info[.originalImage] as? UIImage
else
{
return
}
PhotoView.image = image
dismiss(animated: true, completion: nil)
}
func process() {
if let image = UIImage("test")
{
let originalImage = CIImage(image: image)
let filter = CIFilter(name: FilterName!)
filter?.setDefaults()
filter?.setValue(originalImage, forKey: kCIInputImageKey)
if let outputImage = filter?.outputImage {
let newImage = UIImage(ciImage: outputImage)
PhotoView.image = newImage
}
}
}
}
解决方案
由于您似乎想要选择一个图像,然后让用户点击几个过滤器按钮之一,因此您需要将所选图像从图像选择器保存到UIImage
类中的属性中。
然后更新您的process
方法以使用该属性而不是加载硬编码图像。
将以下属性添加到您的类中:
var selectedImage: UIImage? = nil
然后更新您的图像选择器委托方法以设置此属性:
selectedImage = info[.originalImage] as? UIImage
然后更新您的process
方法以使用该属性而不是加载硬编码图像:
if let image = selectedImage {
推荐阅读
- java - 在 Java 程序中运行可执行 JAR 后如何删除它?
- django - Django 从一个视图重定向到另一个 WITH PARAMETERS
- php - 升级到 php8 后 Composer 版本锁定问题
- python-3.x - 将空格分隔的数据添加到从 tkinter 中的输入框读取的列表中
- python - 为什么我不能在 Ubuntu 20.04 LTS 中使用 Pyautogui?
- json - 如何在 Flutter GetX 中使用 observable 方法处理复杂的 API 数据响应
- java - 在 Java 中序列化并在 C++ 中读取
- javascript - 循环期间的事件
- sql - 如何优化加入
- java - Junit5 测试字符串列表错误答案