2016-06-03 2 views
1

Я хочу, чтобы объединить два UIImage в Swift:объединить два различных изображения в Swift

enter image description here

и

enter image description here

Я пробовал с

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 

} 

а звонок

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) 

результат только изображение, которое я получаю с let image = UIImage(named: imageName), второе изображение (волейбол)

как там моя ошибка?

+2

Что такое «слияние» означает? Как вы хотите, чтобы результат выглядел? Если вы хотите совместить два изображения, почему бы вам просто не нарисовать два изображения в одном контексте изображения? – matt

+0

с слиянием i означает, что оба изображения добавляются к одному изображению (волейбол с треугольником гравитации внизу слева)! ОК? –

+0

Я не рисую его в одном контексте, потому что в одном представлении мне нужен «волейбол» ** без ** треугольника и в другом виде ** с ** треугольником. И это влияет на 20 изображений. Я хочу сохранить ресурсы ... –

ответ

1

Если вы не заботитесь о производительности вы можете использовать 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 
} 
+0

Спасибо beywulf, что он! –

2

Вы можете сделать это в несколько строк:

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() 
+2

Никогда не вызывайте UIGraphicsBeginImageContext; вызовите UIGraphicsBeginImageContextWithOptions. И никогда не звоните ни одному из них, не вызывая UIGraphicsEndImageContext. – matt

+0

Спасибо, матовый, я не знал этого. Хорошо, теперь это будет правильно! UIGraphicsBeginImageContext принимает размер, но не заботится о непрозрачности и масштабах. .. кажется, что это правильно. –

+0

@ Alessandro Ornano, это почти. Все правильно, но «волейбол» выглядит как негатив фотографии. Я хотел бы добавить скриншоты, но я не знаю, как ... –

Смежные вопросы