create ios swift uiimage core-graphics

ios - create - uiimage frame swift 4



¿Cómo fusionar dos UIImages? (6)

Estoy tratando de fusionar dos imágenes diferentes y crear una nueva. Así es como me gustaría hacer: tengo esta imagen (A):

Es una imagen PNG y me gustaría fusionarla con otra imagen (B) que tomé del teléfono para crear algo como esto:

Necesito una función que combine A con B creando C. El tamaño debe permanecer de la imagen A y la imagen B debe adaptarse automáticamente al tamaño para que quepa en la polaroid (A). ¿Es posible hacer eso? ¡Gracias por tu ayuda!

ACTUALIZACIÓN Solo una cosa, la imagen (A) es un cuadrado y la imagen que tomé es un 16: 9, ¿cómo puedo arreglar eso? Si uso su función, la imagen (B) que tomé se estira.


De esta manera la imagen superpuesta será mucho más limpia

class func mergeImages(imageView: UIImageView) -> UIImage { UIGraphicsBeginImageContextWithOptions(imageView.frame.size, false, 0.0) imageView.superview!.layer.renderInContext(UIGraphicsGetCurrentContext()!) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return image }


Espero que esto te pueda ayudar,

var bottomImage = UIImage(named: "bottom.png") var topImage = UIImage(named: "top.png") var size = CGSize(width: 300, height: 300) UIGraphicsBeginImageContext(size) let areaSize = CGRect(x: 0, y: 0, width: size.width, height: size.height) bottomImage!.draw(in: areaSize) topImage!.draw(in: areaSize, blendMode: .normal, alpha: 0.8) var newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext()

Todo lo mejor :)


La respuesta upvote estira la imagen de fondo cambiando su relación. La siguiente solución lo soluciona al representar la imagen desde una vista UIV que contiene las dos vistas de imagen como subvistas.

RESPUESTA QUE ESTÁ BUSCANDO (Swift 4):

func blendImages(_ img: UIImage,_ imgTwo: UIImage) -> Data? { let bottomImage = img let topImage = imgtwo let imgView = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306)) let imgView2 = UIImageView(frame: CGRect(x: 0, y: 0, width: 306, height: 306)) // - Set Content mode to what you desire imgView.contentMode = .scaleAspectFill imgView2.contentMode = .scaleAspectFit // - Set Images imgView.image = bottomImage imgView2.image = topImage // - Create UIView let contentView = UIView(frame: CGRect(x: 0, y: 0, width: 306, height: 306)) contentView.addSubview(imgView) contentView.addSubview(imgView2) // - Set Size let size = CGSize(width: 306, height: 306) // - Where the magic happens UIGraphicsBeginImageContextWithOptions(size, true, 0) contentView.drawHierarchy(in: contentView.bounds, afterScreenUpdates: true) guard let i = UIGraphicsGetImageFromCurrentImageContext(), let data = UIImageJPEGRepresentation(i, 1.0) else {return nil} UIGraphicsEndImageContext() return data }

Los datos de imagen devueltos duplican el tamaño de la imagen, por lo tanto, configure el tamaño de las vistas a la mitad del tamaño deseado.

  • EJEMPLO: Quería que el ancho y alto de la imagen fuera 612 , así que configuré el ancho y alto de los marcos de vista en 306 ) // Disfrutar :)

Versión de Objective C de esta solución con la lógica superior centrada en la imagen:

-(UIImage *)getImageInclosedWithinAnotherImage { float innerImageSize = 20; UIImage *finalImage; UIImage *outerImage = [UIImage imageNamed:@"OuterImage.png"]; UIImage *innerImage = [UIImage imageNamed:@"InnerImage.png"]; CGSize outerImageSize = CGSizeMake(40, 40); // Provide custom size or size of your actual image UIGraphicsBeginImageContext(outerImageSize); //calculate areaSize for re-centered inner image CGRect areSize = CGRectMake(((outerImageSize.width/2) - (innerImageSize/2)), ((outerImageSize.width/2) - (innerImageSize/2)), innerImageSize, innerImageSize); [outerImage drawInRect:CGRectMake(0, 0, outerImageSize.width, outerImageSize.height)]; [innerImage drawInRect:areSize blendMode:kCGBlendModeNormal alpha:1.0]; finalImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return finalImage; }


Swift 4 UIImage extensión que permite unir / superponer fácilmente la imagen.

extension UIImage { func overlayWith(image: UIImage, posX: CGFloat, posY: CGFloat) -> UIImage { let newWidth = size.width < posX + image.size.width ? posX + image.size.width : size.width let newHeight = size.height < posY + image.size.height ? posY + image.size.height : size.height let newSize = CGSize(width: newWidth, height: newHeight) UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) draw(in: CGRect(origin: CGPoint.zero, size: size)) image.draw(in: CGRect(origin: CGPoint(x: posX, y: posY), size: image.size)) let newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return newImage } }


let imagePickerController = UIImagePickerController() imagePickerController.delegate = self let actionSheet = UIAlertController(title: "Photo Source", message: "Choose a source", preferredStyle: .actionSheet) actionSheet.addAction(UIAlertAction(title: "Camera", style:.default, handler: {(action: UIAlertAction)in if UIImagePickerController.isSourceTypeAvailable(.camera){ imagePickerController.sourceType = .camera self.present(imagePickerController, animated: true,completion: nil) } else{ print("camera is not available") } })) actionSheet.addAction(UIAlertAction(title: "Photo Library", style:.default, handler: {(action: UIAlertAction)in imagePickerController.sourceType = .photoLibrary self.present(imagePickerController, animated: true, completion: nil) })) actionSheet.addAction(UIAlertAction(title: "Cancle", style: .cancel, handler: nil)) self.present(actionSheet, animated: true, completion: nil) func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { let image = info[UIImagePickerControllerOriginalImage] as! UIImage myImage.image = image picker.dismiss(animated: true, completion: nil) } func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { picker.dismiss(animated: true, completion: nil) }