Trabalho com imagens em PHP: redimensionamento, corte e otimização com GD e Imagick

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 em PHP: redimensionamento, corte e otimização

\n\n

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

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

1. Biblioteca GD (GDLib)

\n\n

GD é 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\n

1.1. Redimensionamento (resize) com GD

\n\n

A função imagecopyresampled() cria uma nova imagem com interpolação (suavização). Exemplo de redimensionamento para largura de 300px mantendo a proporção:

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

1.2. Corte (crop) com GD

\n\n

Para cortar, usamos a função imagecopy() ou imagecopyresampled() especificando a área. Exemplo — recortando o quadrado central de 200x200:

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

2. Biblioteca Imagick

\n\n

Imagick é 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).

Recommendations