William Luis

0 %
William Luis
Fullstack Developer
  • Residence:
    Canada
  • City:
    Toronto
  • Age:
    26
French
English
Spanish
html
CSS
Js
PHP
WordPress
  • Bootstrap, Materialize
  • Stylus, Sass, Less
  • Gulp, Webpack, Grunt
  • GIT knowledge

Manipulando e redimensionando imagens com PHP

2 de setembro de 2011

Quem nunca precisou desenvolver uma galeria de imagens? Ou até mesmo um simples módulo para destaques de um site, com o redimensionamento automático de fotos para a capa? Manipulação de imagens é uma das tarefas mais comuns em sistemas web e pode vir a ser uma tarefa chata caso toda vez você tenha que reinventar a roda e reescrever dezenas de linha de código para adequar a manipulação aos desejos do cliente.

Neste post apresento uma classe desenvolvida na agência web M2BRNET, exclusivamente para o tratamento e manipulação de imagens utilizando PHP e sua extensão GD.

A classe, apelidada de m2brimagem, ainda está em seu estágio inicial, mas já possui métodos para redimensionamento e conversão de formatos, entre outros. Algumas funções foram reaproveitadas e todos os devidos créditos acompanham o arquivo fonte.

Pré-requisitos

Para utilizar a classe, será necessário o download de sua última versão no link abaixo além de um servidor com php instalado com suporte à biblioteca GD.

Exemplo 1

Agora vamos ao que interessa! Neste primeiro exemplo realizaremos um redimensionamento simples, mantendo a proporção da imagem com a opção crop.

teste.php

[sourcecode language=”php”]
<?php
include(‘m2brimagem.class.php’);
$oImg = new m2brimagem(‘1.jpg’);
$valida = $oImg->valida();
if ($valida == ‘OK’) {
$oImg->redimensiona(200,200,’crop’);
$oImg->grava();
} else {
die($valida);
}
exit;
?>;
[/sourcecode]

O primeiro passo é instanciar o objeto da classe imagem, carregando no construtor a imagem que será manipulada:

[sourcecode language=”php”]
include(‘m2brimagem.class.php’);
$oImg = new m2brimagem(‘1.jpg’);
[/sourcecode]

Logo na sequência validamos a imagem através do método valida. Caso o resultado seja ‘OK’, executamos os métodos para redimensionamento e geramos a nova imagem com saída no navegador. Se a imagem não existir, ou simplesmente não for um arquivo de imagem, o script retornará a mensagem de erro.
[/sourcecode]
O primeiro passo é instanciar o objeto da classe imagem, carregando no construtor a imagem que será manipulada:

[sourcecode language=”php”]
$valida = $oImg->valida();
if ($valida == ‘OK’) {
$oImg->redimensiona(400,200);
$oImg->grava();
} else {
die($valida);
}[/sourcecode]

Clique aqui e veja o arquivo teste.php em ação!

Exemplo 2

Vamos agora dar uma leve incrementada em nosso arquivo teste.php, fazendo com que ele passe a receber via parâmetros as novas dimensões da imagem e o nome do arquivo, permitindo assim o redimensionamento on the fly:

[sourcecode language=”php”]
<?php
include(‘m2brimagem.class.php’);
$arquivo = $_GET[‘arquivo’];
$largura = $_GET[‘largura’];
$altura = $_GET[‘altura’];
$oImg = new m2brimagem($arquivo);
$valida = $oImg->valida();
if ($valida == ‘OK’) {
$oImg->redimensiona($largura,$altura,’crop’);
$oImg->grava();
} else {
die($valida);
}
exit;
?>
[/sourcecode]

baixe o arquivo pronto aqui.

A imagem abaixo está sendo redimensionada em tempo real utilizando o exemplo anterior (confira aqui a imagem original).

  1. <img src=”exemplo2.php?arquivo=2.jpg&largura=200&altura=200″ />

redimensionamento em tempo real

Exemplo 3

E que tal varrer todo um diretório, criar thumbnails e ao mesmo tempo manter as imagens originais? Alguém aí falou em galeria de imagens?

[sourcecode language=”php”]
<?php
// include da classe m2brimagem
include(‘m2brimagem.class.php’);
// instancia objeto m2brimagem
$oImg = new m2brimagem();
// define diretórios
$diretorio = ‘galeria/’;
$dir_thumbs = $diretorio.’thumbs/’;
// varre diretório com as imagens originais
$arquivos = scandir($diretorio);
// lista arquivos do diretório
// e pega somente os de extensão jpg ou jpeg
foreach($arquivos as $arquivo) {
if(eregi(".+.[jJ][pP][eE]?[gG]$", $arquivo)) {
// "carrega" arquivo
$oImg->carrega($diretorio.$arquivo);
$valida = $oImg->valida();
if ($valida == ‘OK’) {
// redimensiona
$oImg->redimensiona(80,80,’crop’);
// salva no diretório das miniaturas
$oImg->grava($dir_thumbs.$arquivo,100);
echo "Miniatura criada para "
. $diretorio.$arquivo
. "<hr />";
} else {
echo "Erro ao criar miniatura para "
. $diretorio.$arquivo
. ": " . $valida . "<hr />";
}
}
}
exit;
?>
[/sourcecode]

Voilá! No exemplo acima, o script varre o subdiretório galeria, procura por arquivos do tipo JPG e cria suas miniaturas dentro de galeria/thumbs/.

Exemplos rápidos

Confira alguns outros métodos da classe m2brimagem em ação:

Marca d’água

[sourcecode language=”php”]
// arquivo, x, y, alfa
$oImg->marca(‘marca.png’,40,10,NULL);
[/sourcecode]

marca d'água

Flip

[sourcecode language=”php”]
$oImg->flip(‘h’);
[/sourcecode]

flip horizontal

Texto / legenda

[sourcecode language=”php”]
$rgb = array(255,255,255);
// texto da legenda, tamanho do texto, x, y, cor (array rgb),
// truetype (true ou false), nome da fonte
$oImg->legenda(‘teste legenda’,’11’,’20’,’20’,$rgb,false,NULL);
[/sourcecode]

legenda em texto

Como citei no início deste post, a classe ainda está em um estágio inicial do desenvolvimento. Diversas melhorias já estão na nossa lista. Para participar e acompanhar o desenvolvimento, enviar comentários, dúvidas e correções, acesse a página do projeto no Google Code.

Atualizações [26/11/2008]

O leitor Giolvani enviou uma implementação de um método para adicionar marcas d’dágua com posicionamento fixo. Segue o exemplo de uso:

[sourcecode language=”php”]
$oImg->marcaFixa(‘marca2.png’,’baixo_direita’);
[/sourcecode]

marca d'água

Clique aqui para conferir todos os posicionamentos disponíveis.

Já nosso amigo CACA-[COBRA] identificou um bug no método de marcas d’água. O parâmetro alfa não estava funcionando corretamente. Na verdade, trata-se de uma limitação da biblioteca GD. Para utilizar transparência na marca d’água, é necessário usar a função imagecopymerge ao invés da imagecopy. O problema é que ela não preserva a transparência original do PNG.

A correção que fiz foi a seguinte: caso você passe um valor para alfa, a classe utilizará a imagecopymerge para criar a marca, gerando uma trasparêcia global para a imagem, mas perdendo o fundo (ou qualquer outra parte) transparente da imagem de marca original. Caso opte por preservar esta transparência original, basta passar o valor de alfa como nulo.

Para entender melhor, veja este exemplo.

Finalizando, também foram corrigidos alguns bugs, incluindo um que afetava a qualidade de imagens JPEG quando a saída era direta no navegador. O método resize (redimensionamento sem especificar crop ou fill) também foi alterado: agora seu redimensionamento não preserva a proporção, distorcendo a imagem se necessário – para manter a proporção passe somente a altura ou largura.

Posted in Dicas, PHPTags:
Write a comment