Trabalho com imagens em Swift: redimensionamento e corte para iOS e macOS
O processamento de imagens é uma das tarefas mais comuns no desenvolvimento de aplicativos móveis e desktop. Nas plataformas Apple (iOS e macOS), para redimensionar (resize) e cortar (crop) imagens, é possível usar tanto frameworks nativos (UIKit para iOS, AppKit para macOS) quanto o poderoso framework de baixo nível Core Graphics. Neste artigo, abordaremos métodos universais que funcionam em ambas as plataformas e forneceremos exemplos de código prontos em Swift.
Principais abordagens para processamento de imagens
Existem três maneiras principais de redimensionar ou cortar uma imagem em Swift:
- UIKit (iOS/tvOS) — usa a classe
UIImagee seus métodosdraw(in:)ouUIGraphicsImageRenderer. - AppKit (macOS) — usa a classe
NSImagee o trabalho comNSGraphicsContext. - Core Graphics (Quartz 2D) — framework C de baixo nível multiplataforma que funciona tanto no iOS quanto no macOS. Baseado em
CGImagee contextos gráficos.
Para universalidade, usaremos Core Graphics, pois permite escrever código que se adapta facilmente a ambas as plataformas. No entanto, para projetos iOS, geralmente é mais conveniente usar UIGraphicsImageRenderer — é mais simples e rápido.
Redimensionamento de imagem (Resize)
A função de redimensionamento recebe a imagem original (UIImage ou NSImage) e um novo tamanho (CGSize). O algoritmo é simples: cria-se um contexto gráfico do tamanho desejado, desenha-se a imagem original nele e, em seguida, extrai-se a nova imagem do contexto.
Exemplo para iOS (UIKit)
import UIKit
extension UIImage { func resized(to newSize: CGSize) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: newSize) return renderer.image { _ in self.draw(in: CGRect(origin: .zero, size: newSize)) } }}
// Uso:if let image = UIImage(named: "example"), let resized = image.resized(to: CGSize(width: 300, height: 200)) { // usar resized}Exemplo para macOS (AppKit + Core Graphics)
import AppKit
extension NSImage { func resized(to newSize: NSSize) -> NSImage? { guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil } let bitmap = NSBitmapImageRep( bitmapDataPlanes: nil, pixelsWide: Int(newSize.width), pixelsHigh: Int(newSize.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bitmapFormat: .alphaFirst, bytesPerRow: 0, bitsPerPixel: 0 ) guard let context = NSGraphicsContext(bitmapImageRep: bitmap!) else { return nil } NSGraphicsContext.saveGraphicsState() NSGraphicsContext.current = context let rect = NSRect(origin: .zero, size: newSize) self.draw(in: rect, from: .zero, operation: .copy, fraction: 1.0) NSGraphicsContext.restoreGraphicsState() let newImage = NSImage(size: newSize) newImage.addRepresentation(bitmap!) return newImage }}Corte de imagem (Crop)
O corte (crop) é a extração de uma área retangular da imagem original. No Core Graphics, usa-se a função cropping(to:) do CGImage. É importante lembrar que as coordenadas no Core Graphics começam no canto inferior esquerdo, portanto, para iOS (onde o eixo Y é invertido), pode ser necessária uma transformação de coordenadas.