Manipulação de imagens com a GD no PHP - redimensionamento proporcional

Desenvolvimento

Web comentários

por erikaheidi em 05/12/2011 12:43:25




Qualquer pessoa que queira desenvolver uma solução personalizada em php que utilize imagens precisa saber manipular o básico com a lib GD. No primeiro post da série, você vai aprender a rotina mais básica e necessária para se trabalhar com imagens no php: redimensionamento proporcional. Serve para criar thumbnails (miniaturas) e também para limitar os tamanhos das imagens enviadas, já que hoje em dia elas estão com uma resolução cada vez maior, mais pesadas, e é imprescindível redimensioná-las para um tamanho pré-definido antes de armazenar no servidor web.

Vamos usar a imagem abaixo para os exemplos:

logan

Vamos começar com a versão simplificada do script, que faz apenas o redimensionamento para um tamanho fixo, não proporcional. O problema dessa abordagem é que assim as imagens ficam quase sempre distorcidas, a não ser que sejam enviadas já na mesma proporção que você vai usar. Exemplo:

$thumb_w = 100;
$thumb_h = 100;

$img = imagecreatefromjpeg("logan.jpg");

$img_w = imagesx($img);
$img_h = imagesy($img);

$thumb = imagecreatetruecolor($thumb_w,$thumb_h);
imagecopyresized($thumb,$img,0,0,0,0,$thumb_w,$thumb_h,$img_w,$img_h);

header("Content-type: image/jpeg");
imagejpeg($thumb);


A imagem utilizada (logan.jpg) mede 720x540, e queremos redimensionar para um tamanho que não é proporcional às suas medidas originais: 100x100 (quadrado). O resultado é a imagem abaixo:

thumbnail desproporcional

Como vocês podem notar, está desproporcional. Agora precisamos fazer um cálculo, usando regra de três, para gerar um thumbnail que continue mantendo a proporção original, mas sem ultrapassar as medidas máximas (100x100).

$larguraMax = 100;
$alturaMax = 100;
$source = "logan.jpg";

$tamanho = getimagesize($source);

$largura = $tamanho[0];
$altura = $tamanho[1];

if($largura > $larguraMax)
{
	$largura = $larguraMax;
	$altura = ($largura * $tamanho[1]) / $tamanho[0];
}

if($altura > $alturaMax)
{
	$altura = $alturaMax;
	$largura = ($tamanho[0] * $altura) / $tamanho[1];
	
	if($largura > $larguraMax)
	{
		$largura = $larguraMax;
		$altura = ($largura * $tamanho[1]) / $tamanho[0];
	}
}

//especifico para jpg
$img = imagecreatefromjpeg($source);
			
$thumb = imagecreatetruecolor($largura,$altura);
imagecopyresized($thumb,$img,0,0,0,0,$largura,$altura,$tamanho[0],$tamanho[1]);

header("Content-type: image/jpeg");
imagejpeg($thumb);

Agora, conseguimos um thumbnail proporcional, que não ultrapassa as medidas máximas estabelecidas. O resultado é a imagem abaixo:

thumbnail proporcional

Apesar de estar funcionando corretamente, do jeito que o script se encontra funcionará apenas para imagens no formato jpg. A versão abaixo, mais completa, detecta o tipo de imagem pela extensão do arquivo e gera corretamente o thumbnail para imagens jpg, png e gif.

$larguraMax = 100;
$alturaMax = 100;
$source = "logan.jpg";

$tamanho = getimagesize($source);

$largura = $tamanho[0];
$altura = $tamanho[1];

if($largura > $larguraMax)
{
	$largura = $larguraMax;
	$altura = ($largura * $tamanho[1]) / $tamanho[0];
}

if($altura > $alturaMax)
{
	$altura = $alturaMax;
	$largura = ($tamanho[0] * $altura) / $tamanho[1];
	
	if($largura > $larguraMax)
	{
		$largura = $larguraMax;
		$altura = ($largura * $tamanho[1]) / $tamanho[0];
	}
}

header("Content-type: image/jpeg");

$ext = array_pop(explode(".",basename($source)));

switch(strtolower($ext))
{
	case "png":
		$fp = imagecreatefrompng($source);
		$thumb = imagecreatetruecolor($largura,$altura);
		imagecopyresampled($thumb,$fp,0,0,0,0,$largura,$altura,$tamanho[0],$tamanho[1]);
		imagepng($thumb);
	
		break;
	
	case "gif":
		$fp = imagecreatefromgif($source);
		$thumb = imagecreatetruecolor($largura,$altura);
		imagecopyresampled($thumb,$fp,0,0,0,0,$largura,$altura,$tamanho[0],$tamanho[1]);
		imagegif($thumb);

		break;
	
	default:
		$fp = imagecreatefromjpeg($source);
		$thumb = imagecreatetruecolor($largura,$altura);
		imagecopyresampled($thumb,$fp,0,0,0,0,$largura,$altura,$tamanho[0],$tamanho[1]);
		imagejpeg($thumb);

                break;
}

 



sobre Erika Heidi

Desenvolvedora Web PHP graduada em publicidade. Especial interesse pelo mundo geek, manipulação de imagens no php e desenvolvimento voltado para redes sociais.


veja o perfil de Erika Heidi no entrebits


Você também pode se interessar por:


Comentários

blog comments powered by Disqus