Trabajo con imágenes: resize, crop en Swift (iOS/macOS)
\n\nEl 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.
Enfoques principales
\n\nEn 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
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\nCambio de tamaño de imagen (Resize)
\n\nLa 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\nEjemplo para iOS (UIKit)
\n\nimport 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\nEjemplo para macOS (AppKit)
\n\nimport 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\nImportante: Para macOS, la función\n\nUIGraphicsBeginImageContextWithOptionsno está disponible. Se utilizalockFocus()/unlockFocus()o Core Graphics.
Recorte de imagen (Crop)
\n\nEl recorte permite seleccionar un área rectangular de la imagen original. Se usa con frecuencia para crear avatares cuadrados o eliminar bordes innecesarios.
\n\nMétodo universal usando Core Graphics
\n\nimport CoreGraphics\n\nextension UIImage {\n func cropped(to rect: CGRect) -> UIImage? {\n guard let cgImage = self.cgImage else { ret También en la biblioteca
Trabajo con XML en Java: bibliotecas y herramientas para el análisis sintáctico
Rate Limiting en PHP: Limitación de frecuencia de solicitudes para proteger el sitio
Validación de datos en PHP con la librería Respect\\Validation
Observation en Swift: guía completa con ejemplos prácticos