Quando estamos desenvolvendo aplicações web é comum nos depararmos com a necessidade de manipular ou redimensionar imagens, por isso, nesse artigo iremos apresentar a utilização de duas classes disponíveis no PHP para manipulação de imagens: a Canvas, classe fornecida pela Agência M2BR, e a WideImage.

Biblioteca para Processamento de Imagem (GD)

O PHP nos possibilita a manipulação de imagens em diversos formatos, como gif, png, jpg, wbmp e xpm. Contudo, para trabalhar com esse tipo de funcionalidade, inicialmente devemos ativar ou instalar a biblioteca GD. Ela é extremamente necessária para utilizarmos as classes de manipulação de imagens que apresentaremos a seguir.

Instalando a GD

A biblioteca GD já vem por padrão no pacote do PHP a partir da versão 4.3.0. Caso ainda não a tenha, pode baixar do site oficial (vide seção Links).

É importante prestar atenção na versão que você está utilizando, pois nas versões anteriores a 1.6, apesar de existir suporte ao formato GIF, não oferece suporte a PNG. Já as versões entre a 1.6 e a 2.0.28 suportam PNG, mas não suportam GIF.

Para checar se a GD está instalada, crie um arquivo chamado info.php com o conteúdo a seguir:


  <?
 phpinfo();
 ?>

Feche o arquivo e salve no diretório próprio do servidor web. Caso você esteja utilizando o Linux, o diretório padrão é o /var/www/.

Entre em um navegador e digite a URL http://localhost/info.php e deverá aparecer uma tela de configuração do PHP. Caso a GD já esteja instalada em algum lugar, deverá aparecer algo semelhante ao mostrado na Tabela 1.

Tabela 1. Configurações do PHP.

GD
GD Support enabled
GD Version 2.1.1-dev
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.4.12
GIF Read Support enabled
GIF Create Support enabled
JPEG Support enabled
libJPEG Version 8
PNG Support enabled
libPNG Version 1.2.49
WBMP Support enabled
XPM Support enabled
libXpm Version 30411
XBM Support enabled
WebP Support enabled

Se você encontrar algo semelhante ao apresentado na Tabela 1, isso quer dizer que a GD já está instalada e no máximo você precisa ativá-la. Para isso, use a configuração -with-gd[=DIR], onde DIR se refere ao diretório de instalação. Se você digitar apenas –with-gd será configurado para utilização a versão recomendada pelo PHP. Lembrando que é pré-requisito para instalação os pacotes libpng e libjpeg para que o GD possa compilar.

No Windows você também irá precisar também do php_gd2.dll que é uma extensão do php.ini.

Para instalar no Ubuntu basta digitar no terminal o seguinte comando:

 sudo apt-get install php5-gd && sudo service apache2 restart 

Um exemplo de funcionalidade bem útil fornecida por essa biblioteca é a de obter o tamanho de uma imagem. Veja como fazer isso na Listagem 1.

Listagem 1. Obtendo o tamanho de uma imagem.


  // Abrindo uma imagem PNG
  $img = imagecreatefromjpeg('/imagens/minha-foto.jpg');
  // Obtendo o tamanho do arquivo de imagem
  $tamanho = getimagesize($img);

Classe Canvas

Canvas é uma classe desenvolvida por um programador brasileiro, chamado Davi Ferreira, e inicialmente se chamava m2brimagem, mas após três anos de utilização passou a se chamar Canvas. Ela apresenta uma gama de funcionalidades para se trabalhar com manipulação de imagens em PHP:

  • Encadear métodos;
  • Carregar imagens sem extensão de imagens;
  • Carregar imagens diretamente de um formulário utilizando apenas o arquivo temporário do PHP;
  • Carregar imagens externas, via URL (vai depender do seu servidor);
  • Criar uma nova imagem "vazia" apenas com cor de preenchimento;
  • Adicionar legendas com posições fixas, assim como já acontecia com marcas d'água (topo_centro, baixo_esquerda etc.);
  • Adicionar cor de fundo nas legendas;
  • Adicionar/configurar cores passando como parâmetro um valor hexadecimal.

Redimensionando uma Imagem

Na Listagem 2 vemos como redimensionar uma imagem utilizando a classe Canvas. Use esse código em um arquivo chamado teste.php.

Listagem 2. Classe teste.php.


  <?php
  require_once( 'canvas.php' );
  $img = new canvas( 'imagem.jpg' );
  $valida = $oImg->valida();
  if ($valida == 'OK') {
          $oImg->redimensiona(200,200,'redimensiona');
      $oImg->grava();
  } else {
          die($valida);
  }
  exit;
  ?>;

Analisando o código vemos que inicialmente instanciamos o objeto da classe m2brimagem, e logo após passamos para seu construtor a localização da imagem que queremos instanciar:


  include('canvas.class.php');
  $oImg = new canvas('imagem1.jpg');

O próximo passo é validar a imagem utilizando o método valida(). Se ele devolver 'OK', então será executado o redimensionamento da imagem e a nova imagem será salva. Caso contrário, o arquivo não se refere a uma imagem ou o endereço é inválido, então será exibida uma mensagem de erro. O trecho de código responsável por isso é o apresentado na Listagem 3.

Listagem 3. Trecho da classe teste.php.


  $valida = $oImg->valida();
  if ($valida == 'OK') {
          $oImg->redimensiona(400,200);
      $oImg->grava();
  } else {
          die($valida);
  }

Para dimensionar a imagem utilizando porcentagem, você pode fazer como na Listagem 4.

Listagem 4. Redimensionamento com porcentagem.


  // 40% da altura da imagem original, largura na proporção
  $oImg->redimensiona('', '40%');
  // 70% da largura da imagem original, altura na proporção
  $oImg->redimensiona('70%', '');

Na Listagem 5 vemos um exemplo da utilização de redimensionamento com preenchimento.

Listagem 5. Redimensionando uma imagem com preenchimento.


  <?php
   
  require_once( 'canvas.php' );
  $img = new canvas( 'minha-imagem.jpg' );
   
  $img->carrega( 'minha-imagem.jpg' )
          ->hexa( '#FF005C' )
          ->redimensiona( 300, 200, 'preenchimento' )
          ->grava();

O resultado deve ser algo como na Figura 1.

resultado da listagem 5

Figura 1. Resultado da Listagem 5

Agora as dimensões, tal como o nome da imagem, serão passadas por parâmetro, de acordo com o código na Listagem 6.

Listagem 6. Passando o nome e as dimensões da imagem por parâmetro.


  <?php
  require_once( 'canvas.php' );
   
  $arquivo        = $_GET['arquivo'];
  $largura        = $_GET['largura'];
  $altura         = $_GET['altura'];
  $oImg = new canvas($arquivo);
  $valida = $oImg->valida();
   
  if ($valida == 'OK') {
          $oImg->redimensiona($largura,$altura,'crop');
      $oImg->grava();
  } else {
          die($valida);
  }
  exit;
   
  ?>

Outros Métodos

Agora vamos apresentar alguns métodos interessantes para manipularmos nossas imagens.

Para adicionar uma marca d'água em uma imagem basta utilizar o código a seguir:

 // nome do arquivo, dimensão x, dimensão y, alfa
  $oImg->marca('marca.png',50,20,NULL);

Para adicionar um texto ou legenda, basta adicionar o código da Listagem 7.

Listagem 7. Adicionando texto ou legenda.


     $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('minha legenda','11','20','20',$rgb,false,NULL);

Carregando uma Imagem pela URL

A classe Canvas também fornece um método para o carregamento de imagens a partir do seu endereço de URL, como podemos ver na Listagem 8.

Listagem 8. Carregando uma imagem pela URL.


  $img->carregaUrl( 'http://www.devmedia.com.br/imagens/2013/Devmedia129x.png' )
          ->redimensiona( 200, 100, 'crop' )
          ->grava();

Cor

Também podemos aplicar uma cor a nossa imagem, como mostra o código da Listagem 9.

Listagem 9. Aplicando uma cor a nossa Imagem.


  $img->carrega( 'minha-imagem.jpg' )
          ->redimensiona( '50%' )
          ->filtra( 'colorir', 1, 255, 0, 92, 60 )
          ->grava();

O resultado será algo como a Figura 2.

resultado da listagem 9

Figura 2. Resultado da Listagem 9

WideImage

Outra classe em PHP muito poderosa para trabalhar com imagens é a WideImage. Nos exemplos a seguir veremos como utilizar alguns de seus métodos, como o resize, que serve para redimensionar, e o crop que serve para cortar imagens de forma automática. Dessa forma, poderemos gerar ou não novos arquivos com essas imagens.

Para utilizar a classe WideImage faz-se necessário o download da mesma do seu site oficial (vide seção Links). Após baixar e salvar em um diretório próprio podemos utilizá-la para a manipulação de imagens. Na Listagem 10 vemos como redimensionar uma imagem.

Listagem 10. Redimensionando uma imagem com o método resize.


  <?php
   
  // endereço para o arquivo com a classe WideImage
  require('/minhapasta/WideImage.inc.php');
   
  // Carrega a imagem que eu quero manipular
  // Coloque o endereço da foto que você quer manipular
  $image = wiImage::load('/imagens/foto.jpg');
   
  // Redimensiona a imagem
  $image = $image->resize(400, 300);
   
  // Você pode opitar por salvar a imagem em um novo arquivo ou substitur o antigo
  $image->saveToFile('/caminho/nova_foto.jpg');

Na Listagem 11 vemos como utilizar essa classe para cortar uma imagem.

Listagem 11. Cortando uma imagem.


  <?php
   
  require('/caminho/WideImage.inc.php');
  $image = wiImage::load('/caminho/foto.jpg');
   
  // Corta a imagem (Você deverá passar como argumentos: X1, Y1, X2, Y2)
  $image = $image->crop(10, 20, 110, 120);
   
  $image->saveToFile('/caminho/nova_foto.jpg');

Agora vamos ver como mudar a qualidade das imagens de acordo com o código da Listagem 12.

Listagem 12. Alterando a qualidade de uma imagem.


  <?php
   
  // Chama o arquivo com a classe WideImage
  require('/caminho/WideImage.inc.php');
   
  // Carrega a imagem a ser manipulada
  $image = wiImage::load('/caminho/minhafoto.jpg');
   
  // Salva a imagem em um arquivo com 70% de qualidade
  $image->saveToFile('/caminho/foto_alterada.jpg', null, 70);

Dentre as funcionalidades oferecidas por essa classe está a de inserir uma imagem dentro da outra, criando um efeito de marca d'agua, como mostra a Listagem 13.

Listagem 13. Criando uma Marca D'água.


  require( "wideimage/WideImage.php");
   
  $image = WideImage::load("img/imagem-principal.png");
  $marca = WideImage::load("img/imagem-marca.png");
   
  $nova_img = $image->merge($marca,'right','bottom');
   
  $nova_img->output('jpg', 90);

Vemos que na segunda linha carrega-se a imagem principal que queremos inserir a marca d'agua e na linha seguinte a imagem que será a marca d'água.

Veja que tilizamos o método merge na imagem principal para passamos como parâmetro o arquivo com a marca d'agua. Os outros dois parâmetros são as posições x e y, onde a marca deverá estar. Poderíamos ter passado o valor em pixel, mas optamos pela posição.

Manipulando Imagens em um Projeto no Framework PHP Yii

Veremos nessa seção como manipular uma imagem utilizando o framework PHP Yii. Assumindo que o mesmo está instalado no diretório YiiRoot e que a raiz do seu servidor web é o WebRoot, abra o prompt de comando e digite o comando a seguir para criar uma pequena aplicação:

 % YiiRoot/framework/yiic webapp WebRoot/testdrive 

Após a execução do comando será gerado um esqueleto de uma aplicação Yii no diretório base do seu servidor web. Para ver o resultado desse comando basta acessar o seguinte endereço: http://nomedoservidor/testdrive/index.php.

A página principal da nossa aplicação deve ser a mesma da Figura 3.

acesso ao servidor

Figura 3. Acesso ao servidor

A estrutura de arquivos e diretórios geradas pelo Yii é a apresentada na Figura 4.

estrutura

Figura 4. Estrutura gerada pelo Yii

O PHP Yii trabalha com arquitetura MVC, ou seja, toda a aplicação está dividida em três camadas. A primeira é o modelo, responsável por manipular as informações de forma mais detalhada e responsável por todas as regras de negócios do site ou sistemas. A segunda camada é a Visão, responsável por prover uma interface de visualização dos sistemas ou site ao usuário. E a terceira camada é a de controle, responsável por controlar todo o fluxo de informação que passa pelo site ou sistema.

A camada que irá nos interessar é a de visão, pois iremos utilizar as classes vistas anteriormente para manipular algumas imagens da nossa aplicação.

Você deverá salvar todas as imagens que deseja utilizar na pasta testdrive/images. Depois entre na pasta views e crie um novo arquivo de visão chamado _view.php, e implemente nele o código da Listagem 14.

Listagem 14. Arquivo de Visão.


  <div class="view">
   
              <!--        Visao parcial de um usuário-->
          
              <?php $img = CHtml::image(Yii::app()->request->baseUrl.'/images/perfilmed.jpg', 'update');
              echo CHtml::link($img);
              ?> <br/>
   
  </div>

No código apresentado basicamente criamos um arquivo PHP com uma div HTML dentro para que posteriormente possamos atribuir estilos CSS a essa nossa página. Em seguida criamos uma variável chamada $img que recebe essa linha de código:

  CHtml::image(Yii::app()->request->baseUrl.'/images/perfiL.jpg', 'update'); 

Em termos gerais, essa linha solicita a imagem na URL /images/perfil,jpg e a salva dentro da variável $img. Em seguida imprimimos essa imagem na tela como o comando:

  echo Chtml::link($img); 

Classe Canvas

Agora vamos adicionar os métodos que aprendemos anteriormente para manipularmos essa imagem.

Para redimensionar uma imagem usamos o código da Listagem 15.

Listagem 15. Redimensionando uma imagem no Yii.


  <?php
   
  require_once( 'canvas.php' );
  $img = new canvas( '/images/perfil.jpg' );
  $oImg->redimensiona(200,200,'redimensiona');
  $oImg->grava();
  ?>
   
  <div class="view">
   
              <!--        Visao parcial de um usuário-->
          
              <?php $nimg = Chtml::image(Yii::app()->request->baseUrl.'/images/perfilmed.jpg','update');
              echo CHtml::link($nimg);
              ?> <br/>
   
  </div>

Veja que estamos pegando a imagem que imprimimos anteriormente e utilizamos a classe canvas para redimensionar, passando como parâmetro as dimensões 200 e 200.

Se quisermos adicionar uma legenda nessa foto, devemos utilizar o código da Listagem 16.

Listagem 16. Adicionando uma legenda na foto.


  <?php
   
  require_once( 'canvas.php' );
  $img = new canvas( '/images/perfil.jpg' );
  $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('minha legenda','11','20','20',$rgb,false,NULL);
  ?>
   
  <div class="view">
   
          <!--        Visao parcial de um usuário-->
          
          <?php $nimg = CHtml::image(Yii::app()->request->baseUrl.'/images/perfil.jpg', 'update');
          echo CHtml::link($nimg);
          ?> <br/>
   
  </div>

Classe WideImage

Para redimensionar uma imagem utilizando a classe WideImage no PHP Yii, devemos utilizar o código da Listagem 17.

Listagem 17. Redimensionando uma imagem com a WideImage no PHP Yii.


  <?php
  // endereço para o arquivo com a classe WideImage
  require('/minhapasta/WideImage.inc.php');
   
  // Carrega a imagem que eu quero manipular
  // Coloque o endereço da foto que você quer manipular
  $image = wiImage::load('/imagens/perfil.jpg');
   
  // Redimensiona a imagem
  $image = $image->resize(400, 300);
   
  // Você pode opitar por salvar a imagem em um novo arquivo ou substitur o antigo
  $image->saveToFile('/caminho/perfil.jpg'); //optei por substituir a imagem antiga pela nova
   
  ?>
   
  <div class="view">
   
              <!--        Visao parcial do usuário-->
          
          <?php $nimg = CHtml::image(Yii::app()->request->baseUrl.'/images/perfil.jpg', 'update');
          echo CHtml::link($nimg));
          
          ?> <br/>
  </div>

Agora vamos alterar a qualidade da nossa imagem utilizando o código da Listagem 18.

Listagem 18. Redimensionando uma imagem.


  // Chama o arquivo com a classe WideImage
  require('/caminho/WideImage.inc.php');
   
  // Carrega a imagem a ser manipulada
  $image = wiImage::load('/caminho/perfil.jpg');
   
  // Salva a imagem em um arquivo com 70% de qualidade
  $image->saveToFile('/caminho/perfil.jpg', null, 70);
   
  <div class="view">
   
              <!--        Visao parcial do usuário-->
          
          <?php $nimg = CHtml::image(Yii::app()->request->baseUrl.'/images/perfil.jpg', 'update');
          echo CHtml::link($nimg));
          
          ?> <br/>
  </div>
  

Espero que tenham gostado. Até mais.

Links

Classe Canvas
https://github.com/daviferreira/canvas

Download de WideImage
http://wideimage.sourceforge.net/

Processamento de Dados
http://libgd.github.io/