Reputation: 1888
I want to merge two UIImage
in Swift:
and
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
Reputation: 409
You can use my simple method to merge two images in half.
Like this:
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
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
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