问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Swift+UIKit实现图片编辑App:滤镜选择与应用

创作时间:
作者:
@小白创作中心

Swift+UIKit实现图片编辑App:滤镜选择与应用

引用
CSDN
10
来源
1.
https://m.blog.csdn.net/weixin_26735419/article/details/108496869
2.
https://m.blog.csdn.net/potato512/article/details/52984667
3.
https://blog.csdn.net/qq_30185503/article/details/105147057
4.
https://www.jianshu.com/p/5bbc6d08ef62
5.
https://www.jianshu.com/p/261ea186b6f8
6.
https://m.blog.csdn.net/weixin_34055910/article/details/94469481
7.
https://blog.csdn.net/offbye/article/details/50888869
8.
https://developer.apple.com/documentation/coreimage/processing_an_image_using_built-in_filters
9.
https://developer.apple.com/cn/videos/play/wwdc2022/10072/?time=1015
10.
https://www.cnblogs.com/jimcheng/p/4166942.html

让我按照规划逐步实现这个图片编辑App的功能。以下是具体的代码实现:

  1. 首先创建一个单视图应用程序,并在ViewController中搭建基本界面结构:
import UIKit
import CoreImage

class ViewController: UIViewController {
    
    let mainImageView = UIImageView()
    let scrollView = UIScrollView()
    var filterImageViews = [UIImageView]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()
        setupScrollView()
        applyFilters()
    }
    
    func setupUI() {
        mainImageView.frame = CGRect(x: 0, y: 100, width: view.frame.width, height: view.frame.width)
        mainImageView.contentMode = .scaleAspectFit
        mainImageView.image = UIImage(named: "sample")
        view.addSubview(mainImageView)
        
        scrollView.frame = CGRect(x: 0, y: mainImageView.frame.maxY + 20, width: view.frame.width, height: 100)
        scrollView.isPagingEnabled = true
        scrollView.showsHorizontalScrollIndicator = false
        view.addSubview(scrollView)
    }
    
    func setupScrollView() {
        let filterNames = ["CISepiaTone", "CIColorInvert", "CIGaussianBlur", "CIPhotoEffectNoir"]
        let filterWidth = scrollView.frame.width / CGFloat(filterNames.count)
        
        for (index, filterName) in filterNames.enumerated() {
            let imageView = UIImageView(frame: CGRect(x: CGFloat(index) * filterWidth, y: 0, width: filterWidth, height: scrollView.frame.height))
            imageView.contentMode = .scaleAspectFit
            scrollView.addSubview(imageView)
            filterImageViews.append(imageView)
            
            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(filterTapped(_:)))
            imageView.addGestureRecognizer(tapGesture)
            imageView.isUserInteractionEnabled = true
        }
        
        scrollView.contentSize = CGSize(width: filterWidth * CGFloat(filterNames.count), height: scrollView.frame.height)
    }
    
    func applyFilters() {
        guard let image = mainImageView.image else { return }
        
        for (index, filterName) in ["CISepiaTone", "CIColorInvert", "CIGaussianBlur", "CIPhotoEffectNoir"].enumerated() {
            if let filter = CIFilter(name: filterName) {
                filter.setValue(CIImage(image: image), forKey: kCIInputImageKey)
                
                if let outputImage = filter.outputImage {
                    let context = CIContext()
                    if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
                        let filteredImage = UIImage(cgImage: cgImage)
                        filterImageViews[index].image = filteredImage
                    }
                }
            }
        }
    }
    
    @objc func filterTapped(_ sender: UITapGestureRecognizer) {
        guard let imageView = sender.view as? UIImageView,
              let index = filterImageViews.firstIndex(of: imageView),
              let filterName = ["CISepiaTone", "CIColorInvert", "CIGaussianBlur", "CIPhotoEffectNoir"][safe: index] else { return }
        
        if let filter = CIFilter(name: filterName) {
            filter.setValue(CIImage(image: mainImageView.image!), forKey: kCIInputImageKey)
            
            if let outputImage = filter.outputImage {
                let context = CIContext()
                if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
                    let filteredImage = UIImage(cgImage: cgImage)
                    mainImageView.image = filteredImage
                }
            }
        }
    }
}
  1. 代码解释:
  • mainImageView用于显示主图片
  • scrollView用于承载滤镜效果图片
  • filterImageViews数组存储scrollView中的所有滤镜图片视图
  • setupUI方法初始化主图片和scrollView的布局
  • setupScrollView方法设置scrollView的分页和滚动条显示,并为每个滤镜图片添加点击手势识别器
  • applyFilters方法应用滤镜效果到scrollView中的图片
  • filterTapped方法处理滤镜图片的点击事件,将选中的滤镜效果应用到主图片上
  1. 运行效果:
  • 应用启动后显示主图片和底部的滤镜效果预览
  • 用户可以通过左右滑动查看不同滤镜效果
  • 点击任意滤镜预览图,主图片将应用相应的滤镜效果

这个实现满足了背景资料中要求的基本功能,使用了Swift和UIKit框架,通过纯代码方式完成了界面搭建和功能实现。同时,利用Core Image框架实现了图片滤镜效果的处理。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号