ios - Swift 5:在照片编辑应用程序上添加图像边框的更好方法/方法?
问题描述
如果标题没有意义,我正在尝试制作一个照片编辑应用程序,用户可以在其中为他们的照片添加边框。现在,我正在测试一个白色边框。
这是应用程序的 gif 示例。(看看滑块有多慢。它应该像任何其他滑块一样平滑。) Gif 示例
我的方法是,将白色背景渲染为图像的大小,然后将图像渲染 n% 以缩小它的边界。
但是我遇到了一个问题,当我在我的设备(iphone 7 plus)上进行测试时,滑块是如此滞后和缓慢,就好像它需要花费大量时间来计算函数一样。
以下是该功能的代码。此功能用作将背景与前景混合。背景为纯白色。
blendImages 是位于我的adjustmentEngine 类上的一个函数。
func blendImages(backgroundImg: UIImage,foregroundImg: UIImage) -> Data? {
// size variable
let contentSizeH = foregroundImg.size.height
let contentSizeW = foregroundImg.size.width
// the magic. how the image will scale in the view.
let topImageH = foregroundImg.size.height - (foregroundImg.size.height * imgSizeMultiplier)
let topImageW = foregroundImg.size.width - (foregroundImg.size.width * imgSizeMultiplier)
let bottomImage = backgroundImg
let topImage = foregroundImg
let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width : contentSizeW, height: contentSizeH))
let imgView2 = UIImageView(frame: CGRect(x: 0, y: 0, width: topImageW, height: topImageH))
// - Set Content mode to what you desire
imgView.contentMode = .scaleAspectFill
imgView2.contentMode = .scaleAspectFit
// - Set Images
imgView.image = bottomImage
imgView2.image = topImage
imgView2.center = imgView.center
// - Create UIView
let contentView = UIView(frame: CGRect(x: 0, y: 0, width: contentSizeW, height: contentSizeH))
contentView.addSubview(imgView)
contentView.addSubview(imgView2)
// - Set Size
let size = CGSize(width: contentSizeW, height: contentSizeH)
UIGraphicsBeginImageContextWithOptions(size, true, 0)
contentView.drawHierarchy(in: contentView.bounds, afterScreenUpdates: true)
guard let i = UIGraphicsGetImageFromCurrentImageContext(),
let data = i.jpegData(compressionQuality: 1.0)
else {return nil}
UIGraphicsEndImageContext()
return data
}
下面是我调用来将其渲染到 uiImageView 中的函数
guard let image = image else { return }
let borderColor = UIColor.white.image()
self.adjustmentEngine.borderColor = borderColor
self.adjustmentEngine.image = image
guard let combinedImageData: Data = self.adjustmentEngine.blendImages(backgroundImg: borderColor, foregroundImg: image) else {return}
let combinedImage = UIImage(data: combinedImageData)
self.imageView.image = combinedImage
此函数将获取图像并将其与边框的新背景颜色混合。
最后,下面是滑块的 didChange 函数的代码。
@IBAction func sliderDidChange(_ sender: UISlider) {
print(sender.value)
let borderColor = adjustmentEngine.borderColor
let image = adjustmentEngine.image
adjustmentEngine.imgSizeMultiplier = CGFloat(sender.value)
guard let combinedImageData: Data = self.adjustmentEngine.blendImages(backgroundImg: borderColor, foregroundImg: image) else {return}
let combinedImage = UIImage(data: combinedImageData)
self.imageView.image = combinedImage
}
所以问题是,有没有更好的方法或优化的方法来做到这一点?还是更好的方法?
解决方案
推荐阅读
- angular - 如何在不使用 `[(ngModel)]` 使相应属性为空的情况下使输入为空?
- python - Django REST:自定义字段,列表可能不为空
- excel - 在没有消息框的情况下自动运行 VBA 宏
- ios - 以编程方式推送 2 个视图 SwiftUI 后立即弹出最后一个视图
- java - 专注于 JButtons 是如何在 Java 中实际工作的?
- asp.net - Asp.net 核心客户端证书身份验证中间件在 X509Chain 构建上失败
- node.js - 无法完全解析 JSON,经过一些解析后它在同一位置崩溃
- android - Flutter:尝试向 FlutterEngine 自动注册插件,但找不到并调用 GeneratedPluginRegistrant
- javascript - 如何仅使用 Javascript 在网站上更改大小而不会出现“无法设置属性‘值为空’”错误?
- sql-server - 多次调用数据库时出现错误 18451:仅,或错误:17810