Trabalho com imagens em TypeScript: redimensionar e recortar
\nNo desenvolvimento web moderno, o processamento de imagens é uma das tarefas mais requisitadas. O TypeScript, graças à sua tipagem forte e integração com Node.js, permite criar ferramentas confiáveis e eficientes para redimensionar (resize) e recortar (crop) imagens. Neste artigo, veremos duas bibliotecas populares: Sharp (processamento no servidor) e Jimp (JavaScript puro), além da abordagem nativa com Canvas API para o navegador.
\n\n1. Instalação e configuração do projeto TypeScript
\nPara começar, crie um projeto e instale as dependências necessárias:
\nnpm init -y\nnpm install typescript @types/node sharp jimp\nnpx tsc --init\nNo arquivo tsconfig.json, certifique-se de que "module": "commonjs" e "target": "ES2020".
2. Biblioteca Sharp — processamento rápido no servidor
\nO Sharp usa o módulo nativo libvips e oferece alto desempenho. É adequado para aplicações no servidor (NestJS, Express).
\n\n2.1. Redimensionamento (resize) com Sharp
\nO método resize() aceita largura e altura. Você pode especificar apenas um parâmetro — o segundo será calculado proporcionalmente.
import sharp from 'sharp';\n\nasync function resizeImage(inputPath: string, outputPath: string, width: number, height?: number): Promise<void> {\n try {\n await sharp(inputPath)\n .resize(width, height, {\n fit: 'cover', // 'cover', 'contain', 'fill', 'inside', 'outside'\n position: 'center' // posição para recorte ao usar cover\n })\n .toFile(outputPath);\n console.log(`Imagem redimensionada: ${outputPath}`);\n } catch (error) {\n console.error('Erro no resize:', error);\n }\n}\n\n// Exemplo de uso\nresizeImage('input.jpg', 'output_800x600.jpg', 800, 600);\n\n2.2. Recorte (crop) com Sharp
\nO método extract() permite recortar uma área retangular. Parâmetros: left, top, width, height.
async function cropImage(\n inputPath: string,\n outputPath: string,\n left: number,\n top: number,\n cropWidth: number,\n cropHeight: number\n): Promise<void> {\n try {\n await sharp(inputPath)\n .extract({ left, top, width: cropWidth, height: cropHeight })\n .toFile(outputPath);\n console.log(`Recorte realizado: ${outputPath}`);\n } catch (error) {\n console.error('Erro no crop:', error);\n }\n}\n\n// Exemplo: recortar o centro 400x400 de uma imagem 800x600\ncropImage('input.jpg', 'cropped_center.jpg', 200, 100, 400, 400);\n\n2.3. Combinando resize e crop
\nO Sharp permite encadear operações. Por exemplo, primeiro reduzir, depois recortar:
\nasync function resizeAndCrop(inputPath: string, outputPath: string): Promise<void> {\n await sharp(inputPath)\n .resize(500, 500, { fit: 'inside' }) // reduz para 500x500 sem recorte\n .extract({ left: 50, top: 50, width: 400, height: 400 }) // recorta o centro\n .toFile(outputPath);\n}\n\nresizeAndCrop('input.jpg', 'processed.jpg');\n\n3. Biblioteca Jimp — JavaScript puro sem dependências nativas
\nO Jimp funciona com JavaScript puro, não requer instalação de bibliotecas de sistema adicionais. É ideal para ambientes isolados (por exemplo, AWS Lambda).
\n\n3.1. Instalação do Jimp
\nnpm install jimp\nnpm install @types/jimp // para TypeScript\n\n3.2. resize com Jimp
\nimport Jimp from 'jimp';\n\nasync function resizeWithJimp(inputPath: string, outputPath: string, width: number, height: number): Promise<void> {\n try {\n const image = await Jimp.read(inputPath);\n image.resize(width, height, Jimp.RESIZE_BILINEAR); // algoritmos: BILINEAR, BICUBIC, NEAREST_NEIGHBOR\n awa Também na biblioteca
Cliente Redis para PHP: Predis — instalação, conexão, exemplos
PyNaCl: Biblioteca de Criptografia para Python
Trabalho com XML em Java: bibliotecas e ferramentas para parsing
Geração de PDF em Swift (iOS/macOS): UIGraphicsPDFRenderer, PDFKit e Core Graphics