Saving an image on top of another image in Swift

前端 未结 4 1857
终归单人心
终归单人心 2020-12-09 11:24

I am learning Swift and I am creating an app that uses a personal photo and puts another on top of it. I now have a hacky solution, to create a screenshot of the area and sa

相关标签:
4条回答
  • 2020-12-09 12:05

    Updated to 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()
    }
    
    0 讨论(0)
  • 2020-12-09 12:12

    I would recommend reading through this thread. All your answers are there. Once you read through that article, the following code sample should help you composite the two images together properly.

    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()
    }
    

    Hopefully this gets you going in the right direction.

    0 讨论(0)
  • 2020-12-09 12:13

    UPDATE FOR 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()
    }
    

    To use the image just refer to newImage

    EXAMPLE HOW TO USE THE IMAGE:

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

    This is an edit of cnoon's answer but optimized for Swift 4.

    0 讨论(0)
  • 2020-12-09 12:25

    Apple advises against UIGraphicsBeginImageContext, so as long as your app supports devices older than iOS 10, then use something like this:

    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))
        }
    }
    

    Besides performance gains, you get full P3 range.

    0 讨论(0)
提交回复
热议问题