iOS: fusionando dos imágenes de diferente tamaño

Me enfrenta el siguiente problema: Tengo que unir dos imágenes A y B para crear una nueva imagen C como resultado de la fusión.
Ya sé cómo combinar dos imágenes, pero en este caso mi objective es un poco diferente.
Me gustaría que esa imagen A sea el fondo para la Imagen B.
Por ejemplo, si el tamaño de la imagen A es 500×500 y el tamaño de la imagen B es 460×460, me gustaría que la imagen C (el resultado de la imagen de la fusión) sea de 500×500, con la imagen B (460×460) centrada en ella.

Gracias de antemano por cualquier ayuda o sugerencia

Esto es lo que hice en mi aplicación, pero sin usar UIImageView :

 UIImage *bottomImage = [UIImage imageNamed:@"bottom.png"]; //background image UIImage *image = [UIImage imageNamed:@"top.png"]; //foreground image CGSize newSize = CGSizeMake(width, height); UIGraphicsBeginImageContext( newSize ); // Use existing opacity as is [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; // Apply supplied opacity if applicable [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.8]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

Si la imagen ya tiene opacidad, no necesita configurarla (como en la imagen inferior), de lo contrario, puede configurarla (como con la imagen).

Después de crear este UIImage , puedes insertarlo en tu UIImageView

ACTUALIZACIÓN : Gracias a Ahmet AkkoK: para usuarios de Swift (2.2), el modo de mezcla macro ha cambiado. CGBlendMode .kCGBlendModeNormal se reemplaza por CGBlendMode.Normal

Hola, tengo varias imágenes, agrego el mismo fondo con un primer plano diferente. Este es mi código.

 UIImage *bottomImage = [UIImage imageNamed:@"photo 2.JPG"]; //background image UIImage *image = [UIImage imageNamed:@"photo 3.JPG"]; //foreground image UIImage *image1 = [UIImage imageNamed:@"photo 4.JPG"]; //foreground image UIImage *image2 = [UIImage imageNamed:@"photo 5.JPG"]; //foreground image CGSize newSize = CGSizeMake(320, 480); UIGraphicsBeginImageContext( newSize ); // Use existing opacity as is [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; // Apply supplied opacity if applicable [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.4]; [image1 drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.3]; [image2 drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:0.2]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); resultView = [[UIImageView alloc] initWithImage:newImage]; resultView.frame = CGRectMake(0, 0,320,460); [self.view addSubview:resultView]; 

Versión Swift

Copiar / Pegar en el patio de recreo

 var bottomImage:UIImage = UIImage(named:"avatar_4.png") //background image 

enter image description here

 var imageTop:UIImage = UIImage(named:"group_4.png") //top image 

enter image description here

 var newSize = CGSizeMake(bottomImage.size.width, bottomImage.size.height) UIGraphicsBeginImageContext( newSize ) bottomImage.drawInRect(CGRectMake(0,0,newSize.width,newSize.height)) // decrease top image to 36x36 imageTop.drawInRect(CGRectMake(18,18,36,36), blendMode:kCGBlendModeNormal, alpha:1.0) var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() var imageData = UIImagePNGRepresentation(newImage) 

enter image description here


Para cargar imágenes desde el patio de recreo:

  • Abre el archivo del playground y crea allí la carpeta Resources
  • copiar imágenes a esta carpeta

enter image description here

Acabo de hacer una función de pegado rápido para aquellos de ustedes que querían usar la respuesta de Srjal Appal . (si las imágenes de fondo y de primer plano son de diferentes tamaños)

 - (UIImage *) mergeImages:(NSString *)bgImageFileName foreGround:(NSString *)fgImageFileName { UIImage *bottomImage = [UIImage imageNamed:bgImageFileName]; //background image UIImage *image = [UIImage imageNamed:fgImageFileName]; //foreground image CGSize newSize = CGSizeMake(bottomImage.size.width, bottomImage.size.height); UIGraphicsBeginImageContext(newSize); // Use existing opacity as is [bottomImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; // Apply supplied opacity if applicable // Change xPos, yPos if applicable [image drawInRect:CGRectMake(11,11,image.size.width,image.size.height) blendMode:kCGBlendModeNormal alpha:1.0]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } 

en Swift:

 let bottomImage = UIImage(named: "Bottom_Image.png") let frontImage = UIImage (named: "Front_Image.png") let size = CGSize(width: 67, height: 55) UIGraphicsBeginImageContext(size) let areaSize = CGRect(x: 0, y: 0, width: size.width, height: size.height) let frontImageSize = CGRect(x: 14, y: 3, width: 40, height: 40) bottomImage!.drawInRect(areaSize, blendMode: CGBlendMode.Normal, alpha: 1.0) frontImage!.drawInRect(frontImageSize, blendMode: CGBlendMode.Normal, alpha: 1.0) let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() 

Gracias @Srikar Appal para iOS soultion.

Para cualquiera que esté buscando fusionarse en OS X:

 - (NSImage *) mergeImages:(NSString *)bgImageFileName foreGround:(NSString *)fgImageFileName { NSImage *bottomImage = [NSImage imageNamed:bgImageFileName]; NSImage *overlayedImage = [NSImage imageNamed:fgImageFileName]; NSSize newSize = NSMakeSize(bottomImage.size.width, bottomImage.size.height); NSSize overlaySize = NSMakeSize(newSize.width/2, newSize.height/2); //change the size according to your requirements NSImage *newImage = [[NSImage alloc] initWithSize:newSize]; [newImage lockFocus]; [bottomImage drawInRect:NSMakeRect(0, 0, newSize.width, newSize.height)]; [overlayedImage drawInRect:NSMakeRect(newSize.width-overlaySize.width, 0, overlaySize.width, overlaySize.height)]; //set the position as required [newImage unlockFocus]; return newImage; } 

Puedes seguir con otro truco como se describe a continuación:

  1. Agregue la primera imagen a un imageView.
  2. Agregue una segunda imagen a otra imageView.
  3. Agregue las imageViews anteriores en una sola imageView principal y acceda a la imagen combinada por propiedad de imageView: mainImageView.image

Echa un vistazo al código a continuación:

  CGRect rect= investmentDetailTblView.frame; int rows = investmentDetailArray.count; CGFloat heightFinal = 5; CGRect frame1; for (int i=0; i