Trabalho com imagens em Swift: redimensionar, recortar (iOS/macOS)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalho com imagens: resize, crop em Swift (iOS/macOS)

\n\n

O 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.

\n\n

Abordagens principais

\n\n

No 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
\n\n

Neste artigo, focaremos no primeiro método, pois é o mais versátil e não requer dependências adicionais.

\n\n

Redimensionamento de imagem (Resize)

\n\n

A 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\n

Exemplo para iOS (UIKit)

\n\n
import 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\n

Exemplo 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, a função UIGraphicsBeginImageContextWithOptions não está disponível. Utiliza-se lockFocus()/unlockFocus() ou Core Graphics.
\n\n

Recorte de imagem (Crop)

\n\n

O recorte permite selecionar uma área retangular da imagem original. É mais frequentemente usado para criar avatares quadrados ou remover bordas indesejadas.

\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