首页 > 解决方案 > 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

    }

所以问题是,有没有更好的方法或优化的方法来做到这一点?还是更好的方法?

标签: iosswiftxcodeuiimageviewuiimage

解决方案


推荐阅读