Convertendo imagens PNG em imagens BMP utilizando PHP
Autor: Antonio | Publicado: 2010-10-17T22:30:00-03:00

Queria utilizar o pacote de ícones Oxygen, o pacote de ícones padrão do KDE 4, no programa que estou desenvolvendo como trabalho de conclusão de curso, mas me esbarrei em um problema: o Delphi 7 não importa arquivos PNG para os ícones dos botões. A solução: pesquisando na Internet, desenvolvi um script em PHP para converter arquivos PNG em arquivos BMP e o utilizei para converter todos os ícones do pacote. Aqui venho mostrá-los minha invenção. As páginas que utilizei como referência aparecem nos comentários.

Observação: esse script também funciona com imagens PNG com transparência!

<![CDATA[
<?php 
 /*
 
 Este script PHP converte imagens no formato PNG em imagens no formato BMP.
 Autor: Antônio Vinícius (http://www.vivaolinux.com.br/~viniciusecia)
 
 Para executar esse script, você precisará da classe BMP, que pode ser obtida no seguinte endereço:
 
 imagebmp + imagecreatefrombmp Download - Softpedia 
 http://webscripts.softpedia.com/scriptDownload/imagebmp---imagecreatefrombmp-Download-58827.html
 
 Coloque o arquivo "BMP.php" na mesma pasta deste script ou altere a linha abaixo. 
 
 */
  
 include_once 'BMP.php';
 
 function ConvertePNG($nome_do_arquivo, $apagar_original = false) {
  /*
  Descrição: função que converte a imagem no formato PNG passada como parâmetro em uma imagem no formato BMP
  
  Parâmetros:
  
  $nome_do_arquivo: caminho do arquivo PNG que deve ser convertido.
  $apagar_original: define se o arquivo original deve ser excluído após a criação do novo arquivo. Por padrão é falso.
  
  Valor retornado: verdadeiro ou falso, conforme a imagem tenha sido convertida ou não    
  
  */

  //Verifica se o arquivo fornecido como parâmetro existe
  if (!file_exists($nome_do_arquivo)) {
   return false;
  }
  //Verifica se o arquivo fornecido como parâmetro é uma imagem .png
  $informacoes_diretorio = pathinfo($nome_do_arquivo);
  if (($informacoes_diretorio['extension'] != 'png') or (is_dir($nome_do_arquivo))) {
   return false;
  }
  //Determina o caminho para a nova imagem
  $diretorio = $informacoes_diretorio['dirname'];
  $arquivo = $informacoes_diretorio['filename'];
  $caminho_nova_imagem = $diretorio.'/'.$arquivo.'.bmp';
  //Apaga a nova imagem, caso já exista
  if (file_exists($caminho_nova_imagem)) {
   unlink($caminho_nova_imagem);
  }
  //Obtém as dimensões da imagem original
  list($largura, $altura) = getimagesize($nome_do_arquivo);
  //Inicia uma nova imagem
  $nova_imagem = imagecreatetruecolor($largura, $altura);
  //Define sua cor de fundo (verde)
  $cor_de_fundo = imagecolorallocate($nova_imagem, 128, 128, 0);
  imagefill($nova_imagem, 0, 0, $cor_de_fundo);
  //Insere a imagem original redimensionada na imagem nova     
  $imagem_original = imagecreatefrompng($nome_do_arquivo);
  imagecopy($nova_imagem, $imagem_original, 0, 0, 0, 0, $largura, $altura);
  //Grava a nova imagem na pasta de destino  
  @imagebmp($nova_imagem, $caminho_nova_imagem);
  if ($apagar_original) {
   unlink($nome_do_arquivo);
  }
  return true;
 }
 
 /* Exemplos de uso da função ConvertePNG() */
 
 //Tenta converter o arquivo "favicon.png" sem apaga-lo
 $arquivo = '/opt/lampp/htdocs/favicon.png';
 if (@ConvertePNG($arquivo)) {
  echo 'O arquivo '.$arquivo.' foi convertido com sucesso!';
 } else {
  echo 'Não foi possível converter o arquivo '.$arquivo.'. Verifique se esse arquivo existe e se é uma imagem PNG válida.';
 }
 
 //Tenta converter o arquivo "favicon.png" e apaga-lo após a conversão
 if (@ConvertePNG($arquivo, true)) {
  echo 'O arquivo '.$arquivo.' foi convertido com sucesso!';
 } else {
  echo 'Não foi possível converter o arquivo '.$arquivo.'. Verifique se esse arquivo existe e se é uma imagem PNG válida.';
 }
 
 //Tenta converter o arquivo "favicon.png". Desta vez deve dar erro, visto que ele foi excluído anteriormente
 if (@ConvertePNG($arquivo)) {
  echo 'O arquivo '.$arquivo.' foi convertido com sucesso!';
 } else {
  echo 'Não foi possível converter o arquivo '.$arquivo.'. Verifique se esse arquivo existe e se é uma imagem PNG válida.';
 }
 
 /*
 
 Deve ser interessante também converter todos os arquivos PNG de determinada pasta e suas subpastas.
 
 Para isso, você pode utilizar a função a seguir em conjunto com a função anterior.
 
 */
 
 function ListarPastasArquivos($pasta = '.', $recursivamente = false) {
  /*
  Descrição: função que lista todos os arquivos e pastas de uma pasta e, opcionalmente, os arquivos e pastas de suas subpastas
  
  Parâmetros:
  
  $pasta: caminho da pasta cujos arquivos e pastas deseja-se listar.
  $recursivamente: define se os arquivos e pastas das subpastas também devem ser listados. Por padrão é falso.
  
  Valor retornado: um array contendo os arquivos e pastas da subpasta passada como parâmetro
  
  Adaptada de: http://www.phpbrasil.info/classes-funcoes-e-scripts/lista-recursiva-de-arquivos    
  
  */
  
  $diretorio = opendir($pasta);
  while ($arquivo = readdir($diretorio)) {
   if (($arquivo != '.') && ($arquivo != '..')) {
    $path = $pasta.'/'.$arquivo;
    $lista[] = $path;
    if ((is_dir($path)) and ($recursivamente)) {
     $subitens = ListarPastasArquivos($path, true);
     foreach ($subitens as $subitem) {
      $lista[] = $subitem;
     }
    }
   }
  }
  closedir($diretorio);
  return $lista;
 } 

 /* Exemplo de conversão recursiva de arquivos PNG em arquivos BMP */

 //Converte todos os arquivos PNG encontrados na pasta "/opt/lampp/htdocs", se houver 
 $listagem = ListarPastasArquivos('/opt/lampp/htdocs', true);
 
 foreach($listagem as $arquivo){
  if (@ConvertePNG($arquivo, false)) {
   echo 'Arquivo convertido: '.$arquivo.'';
  }
 }
?>
]]>