Trabajo con imágenes en Swift: resize, crop (iOS/macOS)

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con imágenes: resize, crop en Swift (iOS/macOS)

\n\n

El procesamiento de imágenes es una de las tareas clave al desarrollar aplicaciones para iOS y macOS. Ya sea para cargar el avatar de un usuario, preparar vistas previas de fotos o trabajar con contenido gráfico, casi con toda seguridad necesitará operaciones de cambio de tamaño (resize) y recorte (crop). En este artículo, analizaremos cómo realizar estas tareas en Swift utilizando los frameworks integrados UIKit (para iOS) y AppKit (para macOS), así como el universal Core Graphics.

\n\n

Enfoques principales

\n\n

En el ecosistema de Apple, existen varias formas de manipular imágenes. Veremos dos de los más populares y eficientes:

\n\n
    \n
  • UIKit / AppKit + Core Graphics — un enfoque de bajo nivel pero muy flexible. Permite controlar con precisión la calidad y el tamaño del resultado.
  • \n
  • Image I/O — un framework para trabajar con metadatos y codificación/descodificación de imágenes. Es ideal para tareas donde el rendimiento es importante al trabajar con archivos grandes.
  • \n
\n\n

En este artículo nos centraremos en el primer método, ya que es el más versátil y no requiere dependencias adicionales.

\n\n

Cambio de tamaño de imagen (Resize)

\n\n

La función de cambio de tamaño toma la imagen original y un tamaño objetivo, y devuelve una nueva imagen con los parámetros especificados. Es importante mantener las proporciones para evitar distorsiones.

\n\n

Ejemplo para iOS (UIKit)

\n\n
import UIKit\n\nextension UIImage {\n    func resized(to targetSize: CGSize) -> UIImage? {\n        // Determinar la escala para ajustarse a targetSize manteniendo las proporciones\n        let widthRatio  = targetSize.width  / size.width\n        let heightRatio = targetSize.height / size.height\n        let scale = min(widthRatio, heightRatio)\n        \n        // Nuevo tamaño manteniendo las proporciones\n        let newSize = CGSize(width: size.width * scale, height: size.height * scale)\n        \n        // Crear un contexto gráfico con el nuevo tamaño\n        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)\n        draw(in: CGRect(origin: .zero, size: newSize))\n        let newImage = UIGraphicsGetImageFromCurrentImageContext()\n        UIGraphicsEndImageContext()\n        \n        return newImage\n    }\n}\n\n// Uso:\nif let image = UIImage(named: "example"),\n   let resized = image.resized(to: CGSize(width: 300, height: 200)) {\n    // Usar resized\n}
\n\n

Ejemplo para macOS (AppKit)

\n\n
import AppKit\n\nextension NSImage {\n    func resized(to targetSize: NSSize) -> NSImage? {\n        let widthRatio  = targetSize.width  / size.width\n        let heightRatio = targetSize.height / size.height\n        let scale = min(widthRatio, heightRatio)\n        \n        let newSize = NSSize(width: size.width * scale, height: size.height * scale)\n        let newImage = NSImage(size: newSize)\n        \n        newImage.lockFocus()\n        draw(in: NSRect(origin: .zero, size: newSize),\n             from: NSRect(origin: .zero, size: size),\n             operation: .copy,\n             fraction: 1.0)\n        newImage.unlockFocus()\n        \n        return newImage\n    }\n}
\n\n
Importante: Para macOS, la función UIGraphicsBeginImageContextWithOptions no está disponible. Se utiliza lockFocus()/unlockFocus() o Core Graphics.
\n\n

Recorte de imagen (Crop)

\n\n

El recorte permite seleccionar un área rectangular de la imagen original. Se usa con frecuencia para crear avatares cuadrados o eliminar bordes innecesarios.

\n\n

Método universal usando Core Graphics

\n\n
import CoreGraphics\n\nextension UIImage {\n    func cropped(to rect: CGRect) -> UIImage? {\n        guard let cgImage = self.cgImage else { ret                    

Recommendations