Reduzir imagens mantendo a proporção

Muita gente tem dúvida em como reduzir uma imagem mantendo a proporção entre largura e altura. A solução é simples. Lógica pura. Matemática, na verdade. :P


Vamos a um exemplo simples e explicado.

Definimos o caminho à imagem a ser reduzida:

1
2
// imagem a ser reduzida
$foto = 'foto2.jpg';

Definimos as dimensões máximas da imagem

1
2
// dimensões máximas da imagem, em pixels (largura e altura)
$tamMax = array( 200, 240 );

Usando a função getimagesize(), do PHP, obtemos a largura, a altura e o tipo da imagem:

1
2
3
4
// 0 => largura
// 1 => Altura
// 2 => Formato da imagem
list( $imgLarg, $imgAlt, $imgTipo ) = getimagesize( $foto );

Esta parte faz o cálculo das novas dimensões da imagem

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// verifica se a imagem é maior que o máximo permitido
if ( $imgLarg > $tamMax[0] || $imgAlt > $tamMax[1] )
{
	// verifica se a largura é maior que a altura
	if ( $imgLarg > $imgAlt )
	{
		$novaLargura = $tamMax[0];
		$novaAltura = round( ($novaLargura / $imgLarg) * $imgAlt );
	}
	// se a altura for maior que a largura
	elseif ( $imgAlt > $imgLarg )
	{
		$novaAltura = $tamMax[1];
		$novaLargura = round( ($novaAltura / $imgAlt) * $imgLarg );
	}
	// altura == largura
	else
	{
		$novaAltura = $novaLargura = max( $tamMax );
	}
}
else
{
	echo "não é necessário redimensionar";
	exit();
}

Por fim, criamos as imagens, fazemos o redimensionamento e exibimos a imagem desejada no navegador:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// cria a imagem baseada na imagem original
$srcImg = imagecreatefromjpeg( $foto );
 
// cria a nova imagem
$destImg = imagecreatetruecolor( $novaLargura, $novaAltura );
 
// copia para a imagem de destino a imagem original redimensionada
imagecopyresampled( $destImg, $srcImg, 0, 0, 0, 0, $novaLargura, $novaAltura, $imgLarg, $imgAlt );
 
// cabeçalho para exibir a imagem no navegador.
// se for salvar em arquivo, não é necessário
header('content-type: image/jpeg' );
 
// exibe a imagem
imagejpeg( $destImg );
 
// destrói as imagens geradas
imagedestroy( $destImg );
imagedestroy( $srcImg );

Usei funções específicas para jpeg pois, nesse caso, usei uma imagem definida no script. Para criar um script genérico, você pode usar o terceiro elemento do array retornado por getimagesize(), a fim de chamar uma função conforme o tipo da imagem. Isso pode ser feito com o auxílio da função call_user_func.

Post simples. Apenas para sanar uma dúvdia recorrente por aí.
Solução simples. :)

Links úteis:
Referência das funções da biblioteca GD
Documentação da função call_user_func

 

The following two tabs change content below.
Graduado em Ciência da Computação, pela Universidade Federal do Paraná (UFPR), é desenvolvedor de software desde 2008, com foco em Desenvolvimento Web com PHP.