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