Neste guia, você fará crop (corte) e redimensionamento em PHP de forma segura e previsível, usando as bibliotecas GD (nativa na maioria das hospedagens) e Imagick (ImageMagick). Também veremos como tratar a orientação EXIF e gerar thumbnails.
<?php
// Redimensiona para caber em $w x $h (modo COVER) e corta o excedente centralmente.
function gd_cover_crop($srcPath, $destPath, $w, $h, $quality = 85) {
// 1) Detecta tipo e cria imagem a partir do arquivo (JPEG/PNG/GIF).
$info = getimagesize($srcPath); if ($info === false) { return false; }
$mime = $info["mime"];
switch ($mime) {
case 'image/jpeg': $src = imagecreatefromjpeg($srcPath); break;
case 'image/png': $src = imagecreatefrompng($srcPath); break;
case 'image/gif': $src = imagecreatefromgif($srcPath); break;
default: return false;
}
// 2) Dimensões originais.
$ow = imagesx($src); $oh = imagesy($src);
// 3) Calcula escala para cobrir (cover) mantendo proporção.
$scale = max($w/$ow, $h/$oh);
$nw = (int)($ow*$scale); $nh = (int)($oh*$scale);
// 4) Centraliza corte no destino.
$dx = (int)(($w - $nw)/2); $dy = (int)(($h - $nh)/2);
// 5) Cria canvas destino e preserva transparência se PNG.
$dst = imagecreatetruecolor($w, $h);
if ($mime === 'image/png') {
imagealphablending($dst, false); imagesavealpha($dst, true);
}
// 6) Redimensiona para o destino (com corte implícito pelas bordas negativas).
imagecopyresampled($dst, $src, $dx, $dy, 0, 0, $nw, $nh, $ow, $oh);
// 7) Salva conforme o tipo de origem (poderia forçar JPG/PNG se desejar).
if ($mime === 'image/jpeg') { imagejpeg($dst, $destPath, $quality); }
elseif ($mime === 'image/png') { imagepng($dst, $destPath); }
elseif ($mime === 'image/gif') { imagegif($dst, $destPath); }
imagedestroy($src); imagedestroy($dst); return true;
}
Use quando quiser um banner 16:9, thumb quadrada 1:1, etc. O cálculo centraliza e corta as sobras mantendo a composição equilibrada.
<?php
// Corrige rotação com base no EXIF (apenas JPEG).
function fix_exif_orientation($path) {
if (!function_exists('exif_read_data')) { return; }
$exif = @exif_read_data($path); if (!$exif || empty($exif['Orientation'])) { return; }
$img = imagecreatefromjpeg($path); if (!$img) { return; }
switch ($exif['Orientation']) {
case 3: $img = imagerotate($img, 180, 0); break;
case 6: $img = imagerotate($img, -90, 0); break;
case 8: $img = imagerotate($img, 90, 0); break;
}
imagejpeg($img, $path, 90); imagedestroy($img);
}
Chame fix_exif_orientation() logo após o upload do JPEG, antes de aplicar o corte para garantir que a geometria esteja correta.
<?php
if (class_exists('Imagick')) {
$img = new Imagick('foto.jpg');
// thumb 400x400 (crop center)
$img->cropThumbnailImage(400, 400);
$img->setImageCompressionQuality(85);
$img->writeImage('thumb.jpg');
}
Se sua hospedagem tiver Imagick, aproveite métodos prontos e desempenho superior em alguns cenários.
imagealphablending(false) e imagesavealpha(true) no GD; exporte como PNG.Precisa gerar senhas, validar CPF/CNPJ ou criar QR Code? Acesse nossos Geradores e Validadores Online.