<?
/*
thumbMaker - vers�o 0.4 - 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 "<center><h3>Imagem n�o encontrada.</h3></center>";
        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 "<center><h3>Tipo inv�lido</h3></center>";
       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. 
    // Retorna um array, onde o elemento 2 cont�m o tipo da imagem.
    $mime= getimagesize($imagem);
    
    // c�digo 2: JPG   
    if ($mime[2] == 2)
    {
       $ext= "jpg";
       return $ext;
    }
    else
    // c�digo 3: PNG
    if ($mime[2] == 3)
    {
       $ext= "png";
       return $ext;
    }
    else
       return false;
}

?>