Trabalho com imagens: resize, crop em Swift (iOS/macOS)
\n\nO processamento de imagens é uma das tarefas essenciais no desenvolvimento de aplicativos para iOS e macOS. Seja para carregar o avatar de um usuário, preparar pré-visualizações de fotos ou trabalhar com conteúdo gráfico, você quase certamente precisará de operações de redimensionamento (resize) e recorte (crop). Neste artigo, vamos analisar como realizar essas tarefas em Swift, utilizando os frameworks nativos UIKit (para iOS) e AppKit (para macOS), além do universal Core Graphics.
Abordagens principais
\n\nNo ecossistema Apple, existem várias maneiras de manipular imagens. Vamos considerar as duas mais populares e eficientes:
\n\n- \n
- UIKit / AppKit + Core Graphics — uma abordagem de baixo nível, mas muito flexível. Permite controlar com precisão a qualidade e o tamanho do resultado. \n
- Image I/O — um framework para trabalhar com metadados e codificação/decodificação de imagens. É ideal para tarefas onde o desempenho ao lidar com arquivos grandes é importante. \n
Neste artigo, focaremos no primeiro método, pois é o mais versátil e não requer dependências adicionais.
\n\nRedimensionamento de imagem (Resize)
\n\nA função de redimensionamento recebe a imagem original e o tamanho desejado, e retorna uma nova imagem com os parâmetros especificados. É importante manter as proporções para evitar distorções.
\n\nExemplo para iOS (UIKit)
\n\nimport UIKit\n\nextension UIImage {\n func resized(to targetSize: CGSize) -> UIImage? {\n // Determina a escala para caber no targetSize, mantendo as proporções\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n // Novo tamanho mantendo as proporções\n let newSize = CGSize(width: size.width * scale, height: size.height * scale)\n \n // Cria um contexto gráfico com o novo tamanho\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 // Usa resized\n}\n\nExemplo 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, a função\n\nUIGraphicsBeginImageContextWithOptionsnão está disponível. Utiliza-selockFocus()/unlockFocus()ou Core Graphics.
Recorte de imagem (Crop)
\n\nO recorte permite selecionar uma área retangular da imagem original. É mais frequentemente usado para criar avatares quadrados ou remover bordas indesejadas.
\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 Também na biblioteca
Colly para Go: guia completo com exemplos práticos
GraphQL em C++: biblioteca cppgraphqlgen para criação de APIs
Trabalhando com CSV em Swift (iOS/macOS): biblioteca SwiftCSV e fundamentos de parsing
Tonic para Rust: guia completo com exemplos