Ios Swift 5:在照片编辑应用程序中添加图像边框的更好方法?
如果标题没有意义,我正在尝试制作一个照片编辑应用程序,用户可以在其中为照片添加边框。现在,我正在测试白色边框 下面是应用程序的gif示例。(查看滑块的速度。它与其他滑块一样平滑。) 我的方法是,将白色背景渲染为图像的大小,然后将图像缩小n%,从而缩小边界 但我遇到了一个问题,当我在我的设备(iPhone7 plus)上测试时,滑块太慢太慢,好像要花很多时间来计算函数 以下是该功能的代码。此函数用于混合背景和前景。背景为纯白色。Ios Swift 5:在照片编辑应用程序中添加图像边框的更好方法?,ios,swift,xcode,uiimageview,uiimage,Ios,Swift,Xcode,Uiimageview,Uiimage,如果标题没有意义,我正在尝试制作一个照片编辑应用程序,用户可以在其中为照片添加边框。现在,我正在测试白色边框 下面是应用程序的gif示例。(查看滑块的速度。它与其他滑块一样平滑。) 我的方法是,将白色背景渲染为图像的大小,然后将图像缩小n%,从而缩小边界 但我遇到了一个问题,当我在我的设备(iPhone7 plus)上测试时,滑块太慢太慢,好像要花很多时间来计算函数 以下是该功能的代码。此函数用于混合背景和前景。背景为纯白色。 blendImages是我的adjustmentEngine类中的
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
}
所以问题是,有没有更好的方法或优化的方法来做到这一点?或者更好的方法?更改滑块实际上不应该混合图像。使图像视图位于白色视图的顶部,滑块只应更改图像视图的
transform
属性,使其变小。这应该快得多。当用户按下“确定”按钮时,应完成图像的实际混合。@Sweeper谢谢!我考虑到了这一点,修改了我的代码算法,现在速度快多了!