使用Swift和UIKit创建图片编辑App
创作时间:
作者:
@小白创作中心
使用Swift和UIKit创建图片编辑App
引用
5
来源
1.
https://www.kodeco.com/18895088-uicollectionview-tutorial-getting-started
2.
https://developer.apple.com/documentation/coreimage/processing_an_image_using_built-in_filters
3.
https://developer.apple.com/tutorials/app-dev-training/adopting-collection-views
4.
https://www.kodeco.com/30195423-core-image-tutorial-getting-started
5.
https://www.hackingwithswift.com/books/ios-swiftui/basic-image-filtering-using-core-image
本篇文章将带你使用Swift和UIKit通过纯代码方式创建一个简单的图片编辑应用程序。这个应用将实现以下功能:
- 界面分为上下两部分:上面显示一张预设的图片,下面是一个可以左右滑动的视图,用于展示不同滤镜效果的缩略图。
- 点击任一缩略图后,上方的图片将应用对应的滤镜效果。
项目结构
首先,我们需要创建一个UIViewController作为主界面,包含一个UIImageView显示原图,以及一个UICollectionView来展示滤镜缩略图。
import UIKit
import CoreImage
class ImageEditorViewController: UIViewController {
let imageView = UIImageView()
let collectionView = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
func setupUI() {
view.addSubview(imageView)
imageView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
imageView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
imageView.heightAnchor.constraint(equalToConstant: 300)
])
imageView.contentMode = .scaleAspectFit
imageView.image = UIImage(named: "your-image-name")
collectionView.dataSource = self
collectionView.delegate = self
collectionView.register(FilterCollectionViewCell.self, forCellWithReuseIdentifier: "FilterCell")
collectionView.backgroundColor = .white
view.addSubview(collectionView)
collectionView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
collectionView.topAnchor.constraint(equalTo: imageView.bottomAnchor),
collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
collectionView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
}
}
实现滤镜功能
接下来,我们需要使用Core Image框架来实现滤镜功能。首先定义一组常用的滤镜:
enum FilterType: String {
case sepiaTone = "CISepiaTone"
case photoEffectInstant = "CIPhotoEffectInstant"
case photoEffectNoir = "CIPhotoEffectNoir"
case photoEffectChrome = "CIPhotoEffectChrome"
case colorInvert = "CIColorInvert"
case colorMonochrome = "CIColorMonochrome"
case colorControls = "CIColorControls"
case exposureAdjust = "CIExposureAdjust"
case gammaAdjust = "CIGammaAdjust"
case hueAdjust = "CIHueAdjust"
case temperatureAndTint = "CITemperatureAndTint"
case vibrance = "CIVibrance"
case whitePointAdjust = "CIWhitePointAdjust"
}
然后,我们需要一个方法来应用滤镜:
func applyFilter(_ filterType: FilterType, to image: UIImage) -> UIImage? {
guard let ciImage = CIImage(image: image) else { return nil }
let context = CIContext()
let filter = CIFilter(name: filterType.rawValue)
filter?.setValue(ciImage, forKey: kCIInputImageKey)
if let outputImage = filter?.outputImage {
if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
return UIImage(cgImage: cgImage)
}
}
return nil
}
处理用户交互
当用户点击collection view中的cell时,我们需要获取对应的滤镜并应用到原图上:
extension ImageEditorViewController: UICollectionViewDataSource, UICollectionViewDelegate {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return FilterType.allCases.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FilterCell", for: indexPath) as! FilterCollectionViewCell
let filterType = FilterType.allCases[indexPath.item]
cell.filterImageView.image = applyFilter(filterType, to: imageView.image!)
cell.filterLabel.text = filterType.rawValue
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let filterType = FilterType.allCases[indexPath.item]
imageView.image = applyFilter(filterType, to: imageView.image!)
}
}
性能优化
为了提高性能,我们需要在后台队列异步处理滤镜生成,并缓存已生成的缩略图:
var filterCache = [FilterType: UIImage]()
func applyFilter(_ filterType: FilterType, to image: UIImage) -> UIImage? {
if let cachedImage = filterCache[filterType] {
return cachedImage
}
DispatchQueue.global(qos: .userInitiated).async {
guard let ciImage = CIImage(image: image) else { return }
let context = CIContext()
let filter = CIFilter(name: filterType.rawValue)
filter?.setValue(ciImage, forKey: kCIInputImageKey)
if let outputImage = filter?.outputImage {
if let cgImage = context.createCGImage(outputImage, from: outputImage.extent) {
let filteredImage = UIImage(cgImage: cgImage)
DispatchQueue.main.async {
self.filterCache[filterType] = filteredImage
}
return filteredImage
}
}
}
return nil
}
最后
通过以上步骤,我们就完成了一个简单的图片编辑App。这个应用展示了如何使用Swift和UIKit创建自定义界面,并使用Core Image框架实现图片滤镜功能。你可以根据需要添加更多滤镜效果,或者优化用户界面和交互体验。
热门推荐
硫酸铝铵:现代农业的新型肥料选择
MySQL三大日志详解:故障排查、数据恢复与性能优化必备
硫酸铝铵:污水处理中的高效净水剂
一文掌握MySQL Workbench:图形化管理四大日志
人偏肺病毒:两种疫苗进入临床,预防措施是当前重点
揭秘《蒙娜丽莎》背后的黑科技
宝宝进入换牙期,家长应该如何做?这些关键点要注意
紫花岭滑雪场怎么去?自驾公交路线最全指南
杭州男子误服生附子中毒,专家提醒:0.2毫克即可致人中毒
科学应对老年人脚肿:从病因分析到实用解决方案
冬季护脚指南:告别鸡眼烦恼
2025年SCMP认证考试改革:难度升级下的通关攻略
“三定”原则加人才培训,企业关键工序管理实现质效双升
关键工序人才职业发展:从技术员到管理层的完整路径与能力提升
家事传承 || 非婚生子女抚养费权益与配偶财产权的冲突及平衡
非遗袁氏疗法助力脑瘤治疗,中医辨证施治显成效
团建新玩法:企业文化知识竞赛让团队在欢笑中成长
中秋国庆团建活动,如何通过致辞加强团队建设?
直击心灵:别让‘在吗’成为沟通障碍
卫生纸上的艺术革命:老赫获年度艺术人物背后
孔子“仁礼智信”助现代人破解成长困境
毛毛虫如何变成蝴蝶?最新研究揭示蜕变之谜
普洱绿茶混搭:一杯兼具降脂抗氧化的养生新选择
常用的关节止痛药布洛芬,有副作用吗?该怎么预防?
囊鳃鳗:海洋中最懒的鱼,拥有独特“口袋胃”储存食物
地铁出行,从外滩到浦东机场的省钱省时攻略
095攻击型核潜艇曝光:万吨级、16垂发,静音性能达95分贝
青岛虚拟电厂与中国能建海洋能源研究院的绿色能源革命
公安部发布预警:谨防新型“线上诈骗+线下取钱”诈骗手法
打牌运气差的破解技巧和方法 如何提升打牌时的运气和胜率