Cambiar el tamaño de UIImage a 200x200pt / px

He estado luchando por cambiar el tamaño de una imagen. Básicamente me he abalanzado sobre: ¿Cómo escalar un UIImage y hacerlo crujiente / nítido al mismo tiempo en lugar de borroso?

Esta parece ser una solución legítima, pero de alguna manera no está funcionando correctamente.

Mi aplicación funciona con fotos del carrete de la cámara. Estas fotos deben redimensionarse a aproximadamente 200×200, mientras que el ancho es importante, no la altura.

Desgraciadamente, no tengo un código de muestra, ya que lo descarté en mi ira sobre la solución no funcional, lo siento.

Aquí está mi código. La imagen tiene un ancho de 850 px y no de 200 px:

func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage { let scale = newWidth / image.size.width let newHeight = image.size.height * scale UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)) image.drawInRect(CGRectMake(0, 0, newWidth, newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } @IBAction func chooseImage(sender: AnyObject) { var myPickerController = UIImagePickerController() myPickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary myPickerController.delegate = self; self.presentViewController(myPickerController, animated: true, completion: nil) } func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { var imagenow = info[UIImagePickerControllerOriginalImage] as? UIImage imageImage.image = resizeImage(imagenow!, newWidth: 200) pimg2 = imageImage.image! cidnew2 = textFieldCID!.text! pname2 = textFieldName!.text pmanu2 = textFieldMan!.text pnick2 = textFieldNick!.text podate2 = textFieldPODate!.text pno2 = textFieldArtNo!.text self.dismissViewControllerAnimated(true, completion: nil) } 

Basado en la respuesta de swift_dan, una actualización para Swift 3

 func resizeImage(image: UIImage, newWidth: CGFloat) -> UIImage? { let scale = newWidth / image.size.width let newHeight = image.size.height * scale UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } 

Si se trata de imágenes PNG que contienen transparencias, la función de respuesta aceptada convertirá las áreas transparentes en negro.

Si desea escalar y mantener las transparencias en su lugar, intente esta función:

SWIFT 3

  extension UIImage { func scaleImage(toSize newSize: CGSize) -> UIImage? { let newRect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height).integral UIGraphicsBeginImageContextWithOptions(newSize, false, 0) if let context = UIGraphicsGetCurrentContext() { context.interpolationQuality = .high let flipVertical = CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: newSize.height) context.concatenate(flipVertical) context.draw(self.cgImage!, in: newRect) let newImage = UIImage(cgImage: context.makeImage()!) UIGraphicsEndImageContext() return newImage } return nil } } 

Para Swift 3.0

simplemente agrega este fragmento como extensión a UIImage . Sin embargo, recuerde que no va a hacer la imagen en forma cuadrada, pero si estaba en esa forma, el resultado será cuadrado.

 extension UIImage { func resizeImage(newWidth: CGFloat) -> UIImage { let scale = newWidth / self.size.width let newHeight = self.size.height * scale UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } } 

Swift 4.0 –

Si se trata de imágenes que contienen transparencias, la función de respuesta aceptada convertirá las áreas transparentes en negro.

Si desea escalar y mantener las transparencias en su lugar, intente esta función:

 func resizeImageWith(image: UIImage, newSize: CGSize) -> UIImage { let horizontalRatio = newSize.width / image.size.width let verticalRatio = newSize.height / image.size.height let ratio = max(horizontalRatio, verticalRatio) let newSize = CGSize(width: image.size.width * ratio, height: image.size.height * ratio) var newImage: UIImage if #available(iOS 10.0, *) { let renderFormat = UIGraphicsImageRendererFormat.default() renderFormat.opaque = false let renderer = UIGraphicsImageRenderer(size: CGSize(width: newSize.width, height: newSize.height), format: renderFormat) newImage = renderer.image { (context) in image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) } } else { UIGraphicsBeginImageContextWithOptions(CGSize(width: newSize.width, height: newSize.height), isOpaque, 0) image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) newImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() } return newImage } 

Esta función devolverá una imagen con el ancho que haya especificado:

 func scaleImage(image: UIImage, maximumWidth: CGFloat) -> UIImage { let rect: CGRect = CGRectMake(0, 0, image.size.width, image.size.height) let cgImage: CGImageRef = CGImageCreateWithImageInRect(image.CGImage!, rect)! return UIImage(CGImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation) } 

Swift 3.0

 func scaledImage(_ image: UIImage, maximumWidth: CGFloat) -> UIImage { let rect: CGRect = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) let cgImage: CGImage = image.cgImage!.cropping(to: rect)! return UIImage(cgImage: cgImage, scale: image.size.width / maximumWidth, orientation: image.imageOrientation) } 

Este código usa UIGraphicsImageRenderer introducido en iOS 10: en mis pruebas fue 10-40% más rápido que las muestras anteriores con UIGraphicsBeginImageContext (Swift 4 / Xcode 9):

 extension UIImage { func renderResizedImage (newWidth: CGFloat) -> UIImage { let scale = newWidth / self.size.width let newHeight = self.size.height * scale let newSize = CGSize(width: newWidth, height: newHeight) let renderer = UIGraphicsImageRenderer(size: newSize) let image = renderer.image { (context) in self.draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize)) } return image } } 

Si está utilizando la lib de kingfisher para cargar imágenes en su proyecto y desea cambiar el tamaño aquí, esta es la manera:

  • Xcode 8
  • Swift 3x
  •  let imageUrl = URL(string: "your image url") //Size refer to the size which you want to resize your original image let size = CGSize(width: 60, height: 60) let processImage = ResizingImageProcessor(targetSize: size, contentMode: .aspectFit) cell.courseTitleImage.kf.setImage(with: imageUrl! , placeholder: UIImage(named: "placeholder"), options: [.transition(ImageTransition.fade(1)), .processor(processImage)], progressBlock: nil, completionHandler: nil) 

    O

    Cambiar el tamaño de la imagen local: puede consultar la respuesta de @Christoph R

     func getScaledDimension(width: CGFloat, height: CGFloat,new_width: CGFloat, new_height: CGFloat)->CGPoint { let widthAspect = (width / new_width) let heightAspect = (height / new_height) if widthAspect == 0 || heightAspect == 0 { return CGPoint(x: width, y: height) } var width1 : CGFloat = 0 var height1 : CGFloat = 0 if widthAspect > heightAspect { width1 = (width) / heightAspect height1 = (height) / heightAspect } else { width1 = (width) / widthAspect height1 = (height) / widthAspect } return CGPoint(x: width1, y: height1 ) } func ResizeImage(image: UIImage, targetSize: CGSize) -> UIImage { let rect = CGRectMake(0, 0, targetSize.width, targetSize.height) UIGraphicsBeginImageContextWithOptions(targetSize, false, 1.0) image.drawInRect(rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } let imagesize = getScaledDimension(image.size.width, height: image.size.height , new_width: Width, new_height: Hieght) print("Image Size Scaled Dimension -> H:\(imagesize.x) W:\(imagesize.y)") let newImage = ResizeImage(image, targetSize: CGSizeMake(imagesize.x,imagesize.y)) print("Resize Image Size -> H\(newImage.size.height) W\(newImage.size.width) ") 

    Reduzca el tamaño de imagen en 1024, siempre puede convertir según la capacidad del servidor

    func resizeImage (image: UIImage) -> UIImage {

      if image.size.height >= 1024 && image.size.width >= 1024 { UIGraphicsBeginImageContext(CGSize(width:1024, height:1024)) image.draw(in: CGRect(x:0, y:0, width:1024, height:1024)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } else if image.size.height >= 1024 && image.size.width < 1024 { UIGraphicsBeginImageContext(CGSize(width:image.size.width, height:1024)) image.draw(in: CGRect(x:0, y:0, width:image.size.width, height:1024)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } else if image.size.width >= 1024 && image.size.height < 1024 { UIGraphicsBeginImageContext(CGSize(width:1024, height:image.size.height)) image.draw(in: CGRect(x:0, y:0, width:1024, height:image.size.height)) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } else { return image } }