segunda-feira, 17 de maio de 2010

Upload de imagens e redimensionamento das mesmas mantendo transparência quando for o caso

Ainda na linha de gerenciador de conteúdos, precisei, recentemente, implementar uma função que permite fazer upload de uma imagem redimensionando-a para um tamanho determinado (se for o caso), respeitando o efeito de transparência.
Você deve estar se perguntando "como assim, respeitando o efeito de transparência?".
Bom... Acontece que o simples uso da função imageCreateTrueColor (nativa do PHP) destrói a transparência das imagens. Para corrigir isto você deve usar a função imagecolorallocatealpha (nativa do PHP) como poderá ser visto no código abaixo.

A função aguarda um tipo $_FILE dentre outros parâmetros que podem ser entendidos no comentário em seu cabeçalho.
Se você não entende o tipo $_FILE, recomendo a leitura de sua documentação no PHP Net (http://php.net/manual/en/features.file-upload.php) para fins de curiosodade, mas você não precisará entendê-la para usar a minha função. Basta você saber que $_FILE trabalha com post de um input do tipo file, como exemplo abaixo:
<input type="file" name="nomearquivo" value="{default|escape}" size="45">

Ainda, esta função foi desenvolvida para os seguintes formatos: JPG, GIF e PNG. Acredito que para estender seu uso para BMP e outros formatos seja bastante trivial. Se alguém precisar e o fizer, por favor, me dê um retorno para eu atualizar o meu código também :-).
Espero que seja útil a mais alguém.

Lá vai a função:
/*uploadResizedImage faz o upload da imagem $fileOriginal, que é um tipo $_FILE, redimensionando-a
  para a largura e altura máximas informadas ($larguraMaxima, $alturaMaxima) na pasta
  $pastaDeMiniaturas no servidor.
  Obs: Se a imagem original for menor que as novas dimensões fornecidas, a imagem não será
  redimensionada(esta função não estica a imagem).
*/
function uploadResizedImage( $fileOriginal, $nomeMiniatura, $direitorioDestino,
                           $larguraMaxima, $alturaMaxima,
                           $redimensionar = true, $qualidade=95)
{
$extensaoDaFotoMaior = strToLower(end(explode(".", $fileOriginal['name'])));

if($extensaoDaFotoMaior == "jpg") $fimDaFuncao = "Jpeg";
else if($extensaoDaFotoMaior == "gif") $fimDaFuncao = "Gif";
else if($extensaoDaFotoMaior == "png") $fimDaFuncao = "Png";
else return false;

$funcao = "ImageCreateFrom" . $fimDaFuncao;
$imagem = $funcao($fileOriginal['tmp_name']);

$larguraOriginal = ImageSX($imagem);
$alturaOriginal  = ImageSY($imagem);

//imagens jpeg tem qualidade de 0 a 100. Png de 0(no compression) a 9.
//Converto abaixo a porcentagem para o formeto esperado pelo png
if(strcmp($fimDaFuncao,"Png")==0) $qualidade = 9-(9*$qualidade/100);

$larguraNova = $larguraOriginal;
$alturaNova  = $alturaOriginal;

if($redimensionar)
{
  if(($larguraMaxima > 0) && ($larguraMaxima < $larguraNova))
  {
    $alturaNova  = $alturaNova*$larguraMaxima/$larguraNova;
    $larguraNova = $larguraMaxima;
  }

  if(($alturaMaxima > 0) && ($alturaMaxima < $alturaNova))
  {
    $larguraNova = $larguraNova*alturaMaxima/$alturaNova;
    $alturaNova = $alturaMaxima;
  }
}

$novaImagem = imageCreateTrueColor($larguraNova, $alturaNova);

//Lidando com transparencias (apenas png e gif suportam este recurso)
if(($extensaoDaFotoMaior == "png") || ($extensaoDaFotoMaior == "gif"))
{
  imagesavealpha($novaImagem, true);
  $trans_colour = imagecolorallocatealpha($novaImagem, 0, 0, 0, 127);
  imagefill($novaImagem, 0, 0, $trans_colour);
}

imageCopyResampled( $novaImagem, $imagem, 0, 0, 0, 0, $larguraNova,
                    $alturaNova, $larguraOriginal, $alturaOriginal);

$funcao = "Image" . $fimDaFuncao;
$gravou = $funcao($novaImagem, $direitorioDestino . $nomeMiniatura.".".$extensaoDaFotoMaior, $qualidade);

ImageDestroy($novaImagem);
ImageDestroY($imagem);
return $gravou;

Nenhum comentário:

Postar um comentário