/*
thumbMaker - versão 0.1 - Por Rogério Bragil - www.bragil.org - Este script
cria um thumbnail de uma imagem através de um cálculo de aproximação. Você
pode criar miniaturas de imagens de diferentes tamanhos que o resultado será
uma coleção de thumbnails de dimensões parecidas. Ideal para albuns de fotos,
onde basta você fazer o upload da imagem e deixar o script gerar o thumbnail.
OBS: trabalha com jpg e png somente. O thumbnail será gerado no diretório thumbs,
portanto você deve criar esse diretório previamente, com permissão de escrita.
e-mail: rogerio@bragil.org - Qualquer sugestão, dúvida ou crítica serão bem aceitos!
o parâmetro aprox é o tamanho que você quer aproximar (por exemplo, você quer reduzir
uma imagem 1024x768 pixels para aproximadamente 200x200 pixels, mas como a imagem
original não é exatamente quadrada, é feito um cálculo, onde esta imagem reduzirá
para, mais ou menos, 200x150 pixels, para não ficar com o aspecto "achatada").
*/
function thumbMaker($imagem, $aprox)
{
if (!file_exists($imagem))
{
echo "
Imagem não encontrada.
";
exit;
}
// verifica se está executando sob windows ou unix-like, para a
// aplicação do separador de diretórios correto.
if (strtoupper(substr(PHP_OS, 0,3) == 'WIN'))
$barra= "\\";
else
$barra= "/";
// obtém a extensão pelo mime-type
$ext= getExt($imagem);
if (!$ext)
{
echo "Tipo inválido
";
exit;
}
// separa o nome do arquivo do(s) diretório(s)
$dir_arq= explode($barra, $imagem);
// monta o nome do arquivo a ser gerado (thumbnail). O sizeof abaixo obtém o número de itens
// no array, dessa forma podemos pegar somente o nome do arquivo, não importando em que
// diretório está.
$i= sizeof($dir_arq) - 1; // pega o nome do arquivo, sem os diretórios
$arquivo_miniatura= "thumbs".$barra."mini_".$dir_arq[$i];
// imagem de origem
if ($ext == "png")
$img_origem= imagecreatefrompng($imagem);
elseif ($ext == "jpg")
$img_origem= imagecreatefromjpeg($imagem);
// obtém as dimensões da imagem original
$origem_x= ImagesX($img_origem);
$origem_y= ImagesY($img_origem);
$x= $origem_x;
$y= $origem_y;
// Aqui é feito um cálculo para aproximar o tamanho da imagem ao valor passado em $aprox.
// Não importa se a foto for grande ou pequena, o thumb de todas elas será mais ou menos do
// mesmo tamanho.
if ($x >= $y)
{
if ($x > $aprox)
{
$x1= (int)($x * ($aprox/$x));
$y1= (int)($y * ($aprox/$x));
}
// incluido o else abaixo. Caso a imagem seja menor do que
// deve ser aproximado, mantém tamanho original para o thumb.
else
{
$x1= $x;
$y1= $y;
}
}
else
{
if ($y > $aprox)
{
$x1= (int)($x * ($aprox/$y));
$y1= (int)($y * ($aprox/$y));
}
// incluido o else abaixo. Caso a imagem seja menor do que
// deve ser aproximado, mantém tamanho original para o thumb.
else
{
$x1= $x;
$y1= $y;
}
}
$x= $x1;
$y= $y1;
// cria a imagem do thumbnail
$img_final = ImageCreateTrueColor($x, $y);
ImageCopyResampled($img_final, $img_origem, 0, 0, 0, 0, $x+1, $y+1, $origem_x, $origem_y);
// o arquivo é gravado
if ($ext == "png")
imagepng($img_final, $arquivo_miniatura);
elseif ($ext == "jpg")
imagejpeg($img_final, $arquivo_miniatura);
// a memória usada para tudo isso é liberada.
ImageDestroy($img_origem);
ImageDestroy($img_final);
}
// getExt - Verifica o mime-type da imagem e retorna a extensão do arquivo
function getExt($imagem)
{
// isso é para obter o mime-type da imagem. Se não me engano, só funciona nas
// versões acima de 4.3.0 do PHP
$mime= exif_imagetype($imagem);
if ($mime == IMAGETYPE_JPEG)
{
$ext= "jpg";
return $ext;
}
else
if ($mime == IMAGETYPE_PNG)
{
$ext= "png";
return $ext;
}
else
return false;
}
?>