Trabajo con imágenes en Swift (iOS/macOS)
Trabajar con imágenes es una de las tareas clave en el desarrollo de aplicaciones móviles y de escritorio. En Swift para iOS y macOS existen numerosas herramientas integradas que permiten cargar, mostrar, procesar y guardar imágenes. En este artículo, analizaremos en detalle los enfoques principales y las API que le ayudarán a trabajar eficazmente con gráficos en las plataformas de Apple.
Clases principales para trabajar con imágenes
Según la plataforma, se utilizan diferentes clases:
- iOS/tvOS/watchOS —
UIImage(UIKit) - macOS —
NSImage(AppKit)
Ambas clases ofrecen capacidades similares, pero tienen diferencias en la API. Para el desarrollo multiplataforma, se pueden usar protocolos comunes o extensiones.
Carga de imágenes
La forma más sencilla es cargar una imagen desde los recursos de la aplicación:
// iOSlet image = UIImage(named: "example")
// macOSlet image = NSImage(named: "example")Para cargar desde la red, use URLSession:
guard let url = URL(string: "https://example.com/image.jpg") else { return }
URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async { // iOS let image = UIImage(data: data) // macOS let image = NSImage(data: data) }}.resume()Visualización de imágenes
Para mostrar imágenes en pantalla, se utilizan los componentes de vista correspondientes:
- iOS —
UIImageView - macOS —
NSImageView
// iOSlet imageView = UIImageView(image: UIImage(named: "photo"))imageView.contentMode = .scaleAspectFit
// macOSlet imageView = NSImageView(image: NSImage(named: "photo"))imageView.imageScaling = .scaleProportionallyUpOrDownProcesamiento de imágenes con Core Image
Core Image es un potente framework para filtrar y procesar imágenes. Veamos un ejemplo básico de aplicación de un filtro:
import CoreImage
func applyFilter(to inputImage: CIImage) -> CIImage? { guard let filter = CIFilter(name: "CISepiaTone") else { return nil } filter.setValue(inputImage, forKey: kCIInputImageKey) filter.setValue(0.8, forKey: kCIInputIntensityKey) return filter.outputImage}
// Usolet originalImage = CIImage(image: UIImage(named: "photo")!)!if let filteredImage = applyFilter(to: originalImage) { let context = CIContext() let cgImage = context.createCGImage(filteredImage, from: filteredImage.extent) let resultImage = UIImage(cgImage: cgImage!)}Filtros populares de Core Image:
CISepiaTone— sepiaCIGaussianBlur— desenfoque gaussianoCIColorControls— ajuste de brillo, contraste, saturaciónCIVignette— viñeteado
Trabajo con píxeles y CGImage
Para el trabajo de bajo nivel con datos de píxeles, use CGImage de Core Graphics:
func pixelColors(from image: UIImage) -> [[UIColor]]? { guard let cgImage = image.cgImage else { return nil } let width = cgImage.width let height = cgImage.height let colorSpace = CGColorSpaceCreateDeviceRGB() let bytesPerPixel = 4 let bytesPerRow = bytesPerPixel * width let bitsPerComponent = 8 var pixelData = [UInt8](repeating: 0, count: width * height * bytesPerPixel) guard let context = CGContext(data: &pixelData, width: width, height: height, bitsPerComponent: bitsPerComponent, También en la biblioteca
Biblioteca WebSocket Gorilla para Go (Golang) — guía completa
Aprendizaje automático en C#: bibliotecas ML.NET y Accord.NET
Cliente Redis para TypeScript: ioredis y redis (node-redis)
Trabajo con CSV en Swift (iOS/macOS) — bibliotecas y ejemplos de código
league/csv para PHP: guía completa con ejemplos