Boteco Digital

Redimensionando imagens com PHP

18/06/2009
Rodrigo Aramburu

Muitas vezes, quando estamos criando um sistema web, necessitamos enviar alguma imagem para o servidor e é só falar a palavra redimensionar que o usuário faz cara feia. Então a responsabilidade fica para o desenvolvedor que deve redimensionar a imagem enviada e armazená-la ou exibi-la.

Antes de começarmos a ver código temos que nos certificar de que a biblioteca GD esteja instalada pois a manipulação de imagens no PHP é feita através das funções desta biblioteca. Por padrão ela já vem instalada no PHP5. No Debian ela pode ser instalada facilmente utilizando o comando:

apt-get install php5-gd

Veremos então um exemplo de como utilizar o PHP para redimensionar uma imagem:

$imagemjpg = "castelo.jpg";
$largura_alvo = $_GET['size'];

$img = imagecreatefromjpeg($imagemjpg);

$largura_original = imagesX($img);
$altura_original = imagesY($img);

$altura_nova = (int) ($altura_original * $largura_alvo)/$largura_original;

$nova = ImageCreateTrueColor($largura_alvo,$altura_nova);
imagecopyresampled($nova, $img, 0, 0, 0, 0, $largura_alvo, $altura_nova, $largura_original,  $altura_original);

header("Content-type: image/jpg");
imagejpeg($nova);

Na linha 1 definimos a imagem, detalhe poderíamos ter recebido ela por parâmetro GET como recebemos o novo tamanho da imagem na linha 2, este valor(size) será a nova largura da imagem e deve ser passado ao chamar o script de redimensionamento.

Na linha 4 criamos uma nova imagem via PHP a partir do arquivo fornecido na linha 1 utilizando a função imagecreatefromjpeg (para criar uma imagem a partir de outros arquivos utilizamos as funções imagecreatefrompng, imagecreatefromgif).

Na linha 6 e 7 pegamos a largura e altura da imagem utilizando as funções imagesX() e imagesX() que retornam respectivamente a largura(eixo x) e altura(eixo y) da imagem passada como parâmetro.

Na linha 9 é onde calculamos a nova altura da imagem, como queremos que nossa imagem tenha uma largura especifica também temos que alterar a altura para a imagem não ficar desproporcional. O cálculo é feito através de uma regra de três simples.

Na linha 11 criamos uma nova imagem em branco com as novas dimensões utilizando a função ImageCreateTrueColor.

Na linha 12 copiamos a imagem antiga(criada na linha 4) para a nova (criada na linha 11) utilizando a função imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

Agora já temos a nossa imagem redimensionada armazenada em $nova então precisamos mostrá-la na tela, para isso utilizaremos a função imagejpeg que envia para o browser a imagem armazenada no parâmetro passado.

Em vez de mostrarmos a imagem no browser podemos salvá-la no servidor utilizando a mesma função, bastando informa como segundo parêmetro o local para ser armazenado.

imagejpeg($nova,'/home/boteco/imagens/imagemredimensionada.jpg');

Um detalhe na linha 14 mudamos nosso Content-type para image/jpg para que possamos visualizá-la no browser diretamente pelo link:


http://www.botecodigital.info/exemplos/redimensionar-imagem/imagem.php?size=500

Também podemos utilizá-lo em uma tag img:

    <img src="http://www.botecodigital.info/exemplos/redimensionar-imagem/imagem.php?size=500" alt="imagem redimensionada" />

A manipulação de imagens no PHP é bem vasta, utilizando as mesmas funções você pode criar vários outros efeitos como marca d’agua, captcha entre outros.

Bom era isso espero que tenham gostado! Paz e prosperidade!


, , , , , , , , , ,

Atualmente existe 9 comentários

  1. Rafael 27/05/2010:

    Usei o codigo mas esta dando erro:
    PHP Warning: Cannot modify header information – headers already sent by (output started at E:\home\aipend\Web\detalhe_aunicio.php:144) in E:\home\aipend\Web\detalhe_aunicio.php on line 159

    usei o ob_start(); e ob_end_flush(); mas ainda sim nao funcionou. pode me ajudar

  2. Rodrigo Aramburu 31/05/2010:

    Este erro ocorre normalmente quando existe alguma saída como o echo antes de modificar o header, tente colocar o header como primeira instrução.

  3. Naison 19/07/2010:

    Muito obrigado pela ajuda! Continue assim, isso é muito lindo!

  4. Kineri 17/08/2010:

    Ótimo tutorial.

    Funcionou exatamente como eu queria.

    Vale lembrar que o diretório de gravação precisa existir antes de usar o imagejpeg()

  5. Júlia Fernandes 02/01/2011:

    Mais uma vez, o seu tutorial foi “otémo!”.
    Obrigadão!

  6. Fauzon 20/03/2011:

    Muito bom…parabens

  7. max 27/10/2011:

    muito bom

  8. Milton 12/11/2011:

    Parabéns, ótimo tutorial, de fácil entendimento.
    Solicito tutorial que mostre como fazer vários uploads de imagens ao mesmo tempo e salvar no BD.

    Milton

Deixe um comentário