Ulli H
Ulli H

Reputation: 1888

merge two different images in Swift

I want to merge two UIImage in Swift:

enter image description here

and

enter image description here

I tried it with

func maskImage(image: UIImage, withMask maskImage: UIImage) -> UIImage {

    let maskRef = maskImage.CGImage

    let mask = CGImageMaskCreate(
        CGImageGetWidth(maskRef),
        CGImageGetHeight(maskRef),
        CGImageGetBitsPerComponent(maskRef),
        CGImageGetBitsPerPixel(maskRef),
        CGImageGetBytesPerRow(maskRef),
        CGImageGetDataProvider(maskRef),
        nil,
        false)

    let masked = CGImageCreateWithMask(image.CGImage, mask)
    let maskedImage = UIImage(CGImage: masked!)

    // No need to release. Core Foundation objects are automatically memory managed.

    return maskedImage

}

and the call

    let imageName = data.valueForKey("imagename")!.description
    let image = UIImage(named: imageName)
    let imageBackground : UIImage = UIImage(named:"background")!    
    let maskedImage: UIImage = self.maskImage(image!, withMask: imageBackground)

    cell.imageButton.setImage(maskedImage, forState: .Normal)

the result is just the image that i get with let image = UIImage(named: imageName), the second image (volleyball)

What´s my error?

Upvotes: 4

Views: 6040

Answers (3)

Kumar Lav
Kumar Lav

Reputation: 409

You can use my simple method to merge two images in half. Like this: enter image description here


  func mergeTwoImage(leftImg:UIImage,rightImg:UIImage) -> UIImage?{
        
        let size = CGSize(width: leftImg.size.width, height: leftImg.size.height)
        UIGraphicsBeginImageContext(size)
        
        let area1 = CGRect(x: 0, y: 0, width: size.width, height: size.height)
        let area2 = CGRect(x: size.width/2, y: 0, width: size.width, height: size.height)
        
        
        leftImg.draw(in: area1)
        rightImg.draw(in: area2, blendMode: .normal, alpha: 1)
        
        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        
        UIGraphicsEndImageContext()
        return finalImage
    }

Upvotes: 1

Alessandro Ornano
Alessandro Ornano

Reputation: 35402

You can do it in few lines:

var bottomImage:UIImage = UIImage(named: "imageName")!
var topImage:UIImage = UIImage(named:"background")!
// Change here the new image size if you want
var newSize = CGSizeMake(bottomImage.size.width, bottomImage.size.height)
UIGraphicsBeginImageContextWithOptions(newSize, false, bottomImage.scale)
bottomImage.drawInRect(CGRectMake(0,0,newSize.width,newSize.height))
topImage.drawInRect(CGRectMake(0,0,newSize.width,newSize.height), blendMode:CGBlendMode.Normal, alpha:1.0)
var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

Upvotes: 4

beyowulf
beyowulf

Reputation: 15331

If you don't care about performance you can use Core Image

let volleyballImage = CIImage(image: UIImage(named:"volleyball.png")!)
let otherImage = CIImage(image: UIImage(named:"other.png")!)
let compositeFilter = CIFilter(name: "CIAdditionCompositing")!

compositeFilter.setValue(volleyballImage,
                         forKey: kCIInputImageKey)
compositeFilter.setValue(otherImage,
                         forKey: kCIInputBackgroundImageKey)

if let compositeImage = compositeFilter.outputImage{
    let image = UIImage(CIImage: compositeImage)
    // do something with the "merged" image
}

Upvotes: 9

Related Questions