Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift 5:在照片编辑应用程序中添加图像边框的更好方法?_Ios_Swift_Xcode_Uiimageview_Uiimage - Fatal编程技术网

Ios Swift 5:在照片编辑应用程序中添加图像边框的更好方法?

Ios Swift 5:在照片编辑应用程序中添加图像边框的更好方法?,ios,swift,xcode,uiimageview,uiimage,Ios,Swift,Xcode,Uiimageview,Uiimage,如果标题没有意义,我正在尝试制作一个照片编辑应用程序,用户可以在其中为照片添加边框。现在,我正在测试白色边框 下面是应用程序的gif示例。(查看滑块的速度。它与其他滑块一样平滑。) 我的方法是,将白色背景渲染为图像的大小,然后将图像缩小n%,从而缩小边界 但我遇到了一个问题,当我在我的设备(iPhone7 plus)上测试时,滑块太慢太慢,好像要花很多时间来计算函数 以下是该功能的代码。此函数用于混合背景和前景。背景为纯白色。 blendImages是我的adjustmentEngine类中的

如果标题没有意义,我正在尝试制作一个照片编辑应用程序,用户可以在其中为照片添加边框。现在,我正在测试白色边框

下面是应用程序的gif示例。(查看滑块的速度。它与其他滑块一样平滑。)

我的方法是,将白色背景渲染为图像的大小,然后将图像缩小n%,从而缩小边界

但我遇到了一个问题,当我在我的设备(iPhone7 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

    }

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

更改滑块实际上不应该混合图像。使图像视图位于白色视图的顶部,滑块只应更改图像视图的
transform
属性,使其变小。这应该快得多。当用户按下“确定”按钮时,应完成图像的实际混合。@Sweeper谢谢!我考虑到了这一点,修改了我的代码算法,现在速度快多了!