Skip to content

Instantly share code, notes, and snippets.

@A-Zak
Last active October 30, 2021 09:11
Show Gist options
  • Save A-Zak/3c38d3f83f911a25790f to your computer and use it in GitHub Desktop.
Save A-Zak/3c38d3f83f911a25790f to your computer and use it in GitHub Desktop.
UIImage extension to combine two images
extension UIImage {
class func imageByCombiningImage(firstImage: UIImage, withImage secondImage: UIImage) -> UIImage {
let newImageWidth = max(firstImage.size.width, secondImage.size.width )
let newImageHeight = max(firstImage.size.height, secondImage.size.height)
let newImageSize = CGSize(width : newImageWidth, height: newImageHeight)
UIGraphicsBeginImageContextWithOptions(newImageSize, false, UIScreen.mainScreen().scale)
let firstImageDrawX = round((newImageSize.width - firstImage.size.width ) / 2)
let firstImageDrawY = round((newImageSize.height - firstImage.size.height ) / 2)
let secondImageDrawX = round((newImageSize.width - secondImage.size.width ) / 2)
let secondImageDrawY = round((newImageSize.height - secondImage.size.height) / 2)
firstImage .drawAtPoint(CGPoint(x: firstImageDrawX, y: firstImageDrawY))
secondImage.drawAtPoint(CGPoint(x: secondImageDrawX, y: secondImageDrawY))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
@hemangshah
Copy link

Updated for Swift 3.x

extension UIImage {
    
    class func imageByCombiningImage(firstImage: UIImage, withImage secondImage: UIImage) -> UIImage {
        
        let newImageWidth  = max(firstImage.size.width,  secondImage.size.width )
        let newImageHeight = max(firstImage.size.height, secondImage.size.height)
        let newImageSize = CGSize(width : newImageWidth, height: newImageHeight)
        
        
        UIGraphicsBeginImageContextWithOptions(newImageSize, false, UIScreen.main.scale)
        
        let firstImageDrawX  = round((newImageSize.width  - firstImage.size.width  ) / 2)
        let firstImageDrawY  = round((newImageSize.height - firstImage.size.height ) / 2)
        
        let secondImageDrawX = round((newImageSize.width  - secondImage.size.width ) / 2)
        let secondImageDrawY = round((newImageSize.height - secondImage.size.height) / 2)
        
        firstImage .draw(at: CGPoint(x: firstImageDrawX,  y: firstImageDrawY))
        secondImage.draw(at: CGPoint(x: secondImageDrawX, y: secondImageDrawY))
        
        let image = UIGraphicsGetImageFromCurrentImageContext()
        
        UIGraphicsEndImageContext()
        
        
        return image!
    }
}

@falsecrypt
Copy link

not very smart. You're calling this already on an image instance, why passing both images as parameters?

@yunustek
Copy link

yunustek commented Oct 5, 2021

We don't need to write first image. Let's look with point parameter:

Swift 5.x

// MARK: Merge Image

extension UIImage {

    func mergeImage(with secondImage: UIImage, point: CGPoint? = nil) -> UIImage {

        let firstImage = self
        let newImageWidth = max(firstImage.size.width, secondImage.size.width)
        let newImageHeight = max(firstImage.size.height, secondImage.size.height)
        let newImageSize = CGSize(width: newImageWidth, height: newImageHeight)

        UIGraphicsBeginImageContextWithOptions(newImageSize, false, deviceScale)

        let firstImagePoint = CGPoint(x: round((newImageSize.width - firstImage.size.width) / 2),
                                      y: round((newImageSize.height - firstImage.size.height) / 2))

        let secondImagePoint = point ?? CGPoint(x: round((newImageSize.width - secondImage.size.width) / 2),
                                                y: round((newImageSize.height - secondImage.size.height) / 2))

        firstImage.draw(at: firstImagePoint)
        secondImage.draw(at: secondImagePoint)

        let image = UIGraphicsGetImageFromCurrentImageContext()

        UIGraphicsEndImageContext()

        return image ?? self
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment