Trabalho com imagens em PHP: redimensionamento, corte e otimização
\n\nO processamento de imagens é uma das tarefas essenciais no desenvolvimento de aplicações web. Seja para avatares de usuários, miniaturas de notícias ou galerias de produtos — quase sempre você precisa redimensionar (resize) e cortar (crop) imagens. Em PHP, existem duas bibliotecas principais para isso: GD (integrada) e Imagick (extensão baseada no ImageMagick).
\n\nNeste artigo, abordaremos ambas as abordagens, mostraremos exemplos práticos de código e daremos recomendações sobre qual biblioteca escolher para o seu projeto.
\n\n1. Biblioteca GD (GDLib)
\n\nGD é uma extensão padrão do PHP, disponível praticamente em qualquer hospedagem. Ela suporta os formatos principais: JPEG, PNG, GIF, WEBP (a partir do PHP 7.1+). A desvantagem é a qualidade de reamostragem inferior em comparação ao Imagick, mas para a maioria das tarefas suas funcionalidades são suficientes.
\n\n1.1. Redimensionamento (resize) com GD
\n\nA função imagecopyresampled() cria uma nova imagem com interpolação (suavização). Exemplo de redimensionamento para largura de 300px mantendo a proporção:
<?php\nfunction resizeImageGD($srcFile, $destFile, $newWidth = 300) {\n // Obtém as dimensões da imagem original\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Cria o recurso da imagem original com base no tipo\n switch ($type) {\n case IMAGETYPE_JPEG:\n $src = imagecreatefromjpeg($srcFile);\n break;\n case IMAGETYPE_PNG:\n $src = imagecreatefrompng($srcFile);\n break;\n case IMAGETYPE_GIF:\n $src = imagecreatefromgif($srcFile);\n break;\n default:\n return false;\n }\n \n // Calcula a nova altura proporcionalmente\n $ratio = $width / $height;\n $newHeight = intval($newWidth / $ratio);\n \n // Cria uma imagem vazia no tamanho desejado\n $dst = imagecreatetruecolor($newWidth, $newHeight);\n \n // Ativa o canal alfa para PNG/GIF\n imagealphablending($dst, false);\n imagesavealpha($dst, true);\n \n // Reamostragem (cópia com recálculo de pixels)\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);\n \n // Salva o resultado\n imagejpeg($dst, $destFile, 85); // qualidade 85%\n \n // Libera a memória\n imagedestroy($src);\n imagedestroy($dst);\n \n return true;\n}\n\n// Uso:\nresizeImageGD('photo.jpg', 'photo_thumb.jpg', 300);\n?>\n\n1.2. Corte (crop) com GD
\n\nPara cortar, usamos a função imagecopy() ou imagecopyresampled() especificando a área. Exemplo — recortando o quadrado central de 200x200:
<?php\nfunction cropCenterGD($srcFile, $destFile, $cropSize = 200) {\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Determina o tipo\n $src = imagecreatefromjpeg($srcFile); // exemplo JPEG\n \n // Calcula as coordenadas do quadrado central\n $x = ($width - $cropSize) / 2;\n $y = ($height - $cropSize) / 2;\n \n // Se a imagem original for menor que o tamanho do corte — não corta\n if ($width < $cropSize || $height < $cropSize) {\n $cropSize = min($width, $height);\n $x = 0;\n $y = 0;\n }\n \n $dst = imagecreatetruecolor($cropSize, $cropSize);\n imagecopy($dst, $src, 0, 0, $x, $y, $cropSize, $cropSize);\n \n imagejpeg($dst, $destFile, 90);\n imagedestroy($src);\n imagedestroy($dst);\n}\n\ncropCenterGD('photo.jpg', 'cropped.jpg', 200);\n?>\n\n2. Biblioteca Imagick
\n\nImagick é uma extensão poderosa que fornece uma interface orientada a objetos para o ImageMagick. Suporta mais de 200 formatos, excelente qualidade de reamostragem, trabalho com cores, filtros e animação. Requer instalação no servidor (nem sempre disponível em hospedagens baratas).
Também na biblioteca
Cliente HTTP para C++: as melhores bibliotecas para trabalhar com rede
charm/bubbletea para Go: guia completo com exemplos
Cache em TypeScript: Redis, node-cache e outras ferramentas
Knex.js para JavaScript (Node.js): guia completo com exemplos práticos
Swift Data para Swift: guia completo com exemplos práticos