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的功能。以下是具体的代码实现:
- 首先创建一个单视图应用程序,并在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
}
}
}
}
}
- 代码解释:
mainImageView
用于显示主图片scrollView
用于承载滤镜效果图片filterImageViews
数组存储scrollView中的所有滤镜图片视图setupUI
方法初始化主图片和scrollView的布局setupScrollView
方法设置scrollView的分页和滚动条显示,并为每个滤镜图片添加点击手势识别器applyFilters
方法应用滤镜效果到scrollView中的图片filterTapped
方法处理滤镜图片的点击事件,将选中的滤镜效果应用到主图片上
- 运行效果:
- 应用启动后显示主图片和底部的滤镜效果预览
- 用户可以通过左右滑动查看不同滤镜效果
- 点击任意滤镜预览图,主图片将应用相应的滤镜效果
这个实现满足了背景资料中要求的基本功能,使用了Swift和UIKit框架,通过纯代码方式完成了界面搭建和功能实现。同时,利用Core Image框架实现了图片滤镜效果的处理。
热门推荐
塔罗牌教你读懂爱情密码
抖音上的塔罗牌爱情咨询:35亿次播放背后的玄学产业
塔罗牌恋人正位:教你如何在恋爱中做出明智选择
益生菌猴头菇丁香片:肠胃健康的秘密武器!
济南电动自行车新规落地:上牌更严、市场洗牌、消费者需谨慎
春节被催婚?这些招数让你从容应对!
传统文化下的催婚焦虑
内啡肽和多巴胺的区别是什么
想自然提升内啡肽?这8种日常方法不如一试
多巴胺和内啡肽的区别和作用
金祥名字的文化密码:财富与好运
隋唐演义中的猛将传奇——罗士信的战功与忠诚
唐朝四大武将:罗士信、李靖、薛仁贵、苏定方
济南出发自驾游新疆全攻略:路线、景点、食宿及必备关注事项指南
选包包时pu皮和pvc哪个好?这两种材质有什么区别?
赵本山、宋丹丹、赵丽蓉:春晚经典小品回顾
2024央视春晚回顾:花开中国梦,创新绽芳华
市场波动下的投资风险管理攻略
从《吃面条》到《我的中国心》,春晚见证时代变迁
DeepSeek vs GPT-4:谁是AI界的王者?
易经智慧与情绪管理
1个月涨粉600万,带货2个亿,老板们成新媒体流量密码?
《千金女贼》:一部关于反叛与自由的传奇故事
腰酸背痛、吃得油腻……针对节后常见小毛病,中医支出妙招!
刘畅新剧《180天重启计划》热播:从古装到现代,演员转型获好评
刘畅回应《舍我其谁》争议:围棋+甜宠的创新尝试
中国风歌词:传统与现代的完美融合
如何写出打动人心的歌词?
肖战《都一样》:一首温暖人心的都市夜曲
维摩诘居士的“不二法门”:如何在红尘中修行?