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框架实现了图片滤镜效果的处理。
热门推荐
视频|这些“江门好物”,都来南国书香节了!
地球与太阳的“拉锯战”:近日点和远日点的秘密
新疆博物馆揭秘:千年年夜饭长啥样?
冬季自驾游哈沈,这些安全小贴士你必须知道!
冬日自驾穿越记:从沈阳到哈尔滨的冰雪奇缘
年夜饭里的传统与创新:从酥白肉到海鲜拼盘
大理“美味之事”,别错过哦~
慈禧太后与北京烤鸭:一段皇家美食传奇
全聚德PK便宜坊:谁才是正宗北京烤鸭?
冬日打卡:哈尔滨&雪乡的历史文化探秘
冬日打卡:哈尔滨冰雪大世界 & 镜泊湖
从伽利略到嫦娥五号:人类观测月球400年的认知飞跃
中秋将至,书法名家笔下的月亮诗
温州启动谯楼及华盖山城墙保护工程,千年古迹焕发新生机
《机器人总动员》:探索人性与环保的深刻动画之旅
“本命年”是什么来头?为什么要穿红裤头?
李白笔下的月亮:浪漫与哲思的完美融合
陆游笔下的中秋月:思乡与哀愁并存
“月球之王”哥白尼环形山:观测与探索的完美目标
朱自清《荷塘月色》里的月光美
粤菜爱好者必学:姜葱鸡家常做法
广东人推荐:姜葱手撕鸡最佳食材大揭秘!
交流电的周期、频率、瞬时值、有效值、相位、相位差概念
有刷直流电机启动时的电流分析方法详解
大同双璧:悬空寺与华严寺的千年传奇
康熙名字背后的盛大文化
胃癌转肝癌晚期还有办法治疗吗?如何能控制病情发展
胃癌新型辅助治疗方法
雷皓明律师详解:如何合法解除母子关系?
主体性和共体性:隐藏在AI里的那个人