【问题标题】:Saving an image on top of another image in Swift在 Swift 中将图像保存在另一个图像之上
【发布时间】:2015-03-15 15:13:42
【问题描述】:

我正在学习 Swift,我正在创建一个应用程序,该应用程序使用个人照片并在其上放置另一张照片。我现在有一个 hacky 解决方案,创建该区域的屏幕截图并保存它。我需要在 Swift 中执行此操作

@IBAction func saveImage(sender: AnyObject) {
    //Create the UIImage
    UIGraphicsBeginImageContext(imageView.frame.size)
    view.layer.renderInContext(UIGraphicsGetCurrentContext())
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    //Save it to the camera roll
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

但是,这是有效的,现在不再有效。但是,这也不是最好的解决方案。

各位,我怎样才能将个人图像中的图像保存到相机胶卷中,并将图像作为叠加层?

我们将不胜感激!谢谢!

【问题讨论】:

标签: iphone image swift


【解决方案1】:

我建议通读this 线程。你所有的答案都在那里。阅读完那篇文章后,以下代码示例应该可以帮助您正确地将两张图像合成在一起。

func saveImage() {
    let bottomImage = UIImage(named: "bottom")!
    let topImage = UIImage(named: "top")!

    let newSize = CGSizeMake(100, 100) // set this to what you need
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)

    bottomImage.drawInRect(CGRect(origin: CGPointZero, size: newSize))
    topImage.drawInRect(CGRect(origin: CGPointZero, size: newSize))

    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

希望这能让你朝着正确的方向前进。

【讨论】:

  • 亲爱的 cnoon,我不知道如何使用它,因为那是 Objective C,我需要在 Swift 中执行此操作。 :(
  • 嗨@user3528618,我更新了答案以更具体地针对您的用例。
【解决方案2】:

SWIFT 4 更新

func saveImage() {
    let bottomImage = UIImage(named: "your bottom image name")!
    let topImage = UIImage(named: "your top image name")!            
    let newSize = CGSize(width: 100, height: 100)   // set this to what you need
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    bottomImage.draw(in: CGRect(origin: CGPoint.zero, size: newSize))
    topImage.draw(in: CGRect(origin: CGPoint.zero, size: newSize))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
}

图片使用请参考newImage

图片使用示例:

@IBOutlet weak var imageButton: UIButton!
imageButton.setBackgroundImage(newImage), for: .normal) 

这是 cnoon's answer 的编辑,但针对 Swift 4 进行了优化。

【讨论】:

    【解决方案3】:

    Apple 建议不要使用 UIGraphicsBeginImageContext,因此只要您的应用支持 iOS 10 之前的设备,就可以使用以下内容:

    private func drawLogoIn(_ image: UIImage, _ logo: UIImage, position: CGPoint) -> UIImage {
        let renderer = UIGraphicsImageRenderer(size: image.size)
        return renderer.image { context in
            image.draw(in: CGRect(origin: CGPoint.zero, size: image.size))
            logo.draw(in: CGRect(origin: position, size: logo.size))
        }
    }
    

    除了性能提升之外,您还可以获得完整的 P3 范围。

    【讨论】:

    • 我的徽标图像方向错误,您能帮忙吗?
    【解决方案4】:

    更新到 Swift 3.0:

    func saveImage() {
        let bottomImage = UIImage(named: "bottom")!
        let topImage = UIImage(named: "top")!
    
        let newSize = CGSizeMake(100, 100) // set this to what you need
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    
        bottomImage.draw(in: CGRect(origin: CGPointZero, size: newSize))//As drawInRect is deprecated
        topImage.draw(at: CGRect(origin: CGPointZero, size: newSize))//As drawInRect is deprecated
    
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
    }
    

    【讨论】:

    • 它失去了分辨率
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2013-08-10
    • 2013-01-29
    相关资源
    最近更新 更多