<?PHP
//
//
// Scale pictures with PHP
//

/*

    This file was written by Thorsten Gunkel <www1@tgunkel.de> to create
    most pages of <url:http://www.tgunkel.de>.
    Copyright (C) 2003 Thorsten Gunkel

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation version 2 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

*/

// // This function rescales an image. There are different rescale modes available
// function resize_image($filename,$mode, $val1, $val2)
// {
//   resize_image2($filename,$mode, $val1, $val2, '', '');
// }

// This function rescales an image. There are different rescale modes available
function resize_image2($filename,$mode$val1$val2$outputfilename$urlprefix)
{
  
// we need an input file
  
if (!file_exists($filename))
  {
      echo 
'Error: File does not exist.';
  }
  else
  {
      if (
$outputfilename!=''$outputfilename='_thumbs/'.$outputfilename;

      
// do nothing if outputfile is fresh
      
if (outputfileisfresh($filename$outputfilename))
      {
        
redirecttosmallfile($outputfilename,$urlprefix);
      }

      
// foo.JPG -> jpg
      
$suffix=preg_replace('/(^.*)(\.[^\.]*$)/','$2',$filename);
      
$suffix=strtolower($suffix);

      
$error=false;      
      switch(
$suffix)
    {
     case 
'.png':
       
header('Content-type: image/png');
       
$image imagecreatefrompng($filename);
       
$image_p=my_scale($mode,$filename,$image$val1$val2);
           if (
$outputfilename!='')
             {
               
imagepng($image_p,$outputfilename);
               
redirecttosmallfile($outputfilename,$urlprefix);
             }
           else
             {
               
imagepng($image_p);
             }
       break;

     case 
'.jpg':
     case 
'.jpeg':
       
header('Content-type: image/jpeg');

       
$image imagecreatefromjpeg($filename);

       
$image_p=my_scale($mode,$filename,$image$val1$val2);
           if (
$outputfilename!='')
             {
               
imagejpeg($image_p,$outputfilename);
               
redirecttosmallfile($outputfilename,$urlprefix);
             }
           else
             {
               
imagejpeg($image_p);
             }
      break;

     default:
       echo 
'Error: Unsopported file suffix.';
      break;

    }

    }
}

  
// different rescale modes
  
function my_scale($mode,$filename,$image,$val1,$val2)
  {
    if (!
is_file($filename))
    {
    return 
false;
    }
    else
    {
    list(
$ow$oh) = getimagesize($filename);
    
    if (
$ow<=|| $oh<=0)
        {
        return 
false;
    }
    else
        {
        
// default changes nothing
        
$ox=0;
        
$oy=0;
        
$nx=0;
        
$ny=0;    
        
$nw=$ow;
        
$nh=$oh;
        
        switch(
$mode)
          {
        
// enforce a height
          
case 'Amode':
        
$dest=$val1;
        
$nw=($dest/$oh)*$ow;
        
$nh=$dest;
        break;
      
        
// enforce height and weight are each below a maxvalue
          
case 'Bmode':
        
$destx=$val1;
        
$desty=$val2;
        
        
        
$scalex=$destx/$ow;
        
$scaley=$desty/$oh;
        
        
$scale=min($scalex,$scaley,1);
        
        
$nw=$ow*$scale;
        
$nh=$oh*$scale;
        break;
      
        
// enforce height and weight 
          
case 'Cmode':
        
$dest=$val1;
        
$nw=$dest;
        
$nh=$dest;
        
// if height!=width fix aspect ratio
        
if ($ow<$oh)
          {
            
$ox=($ow-$oh)/2;            
            
$nx=($ox/2)*($dest/$ow);
          }      
        else
          {
            
$oy=($oh-$ow)/2;
            
$ny=($oy/2)*($dest/$oh);
          }
        break;
        
          default:
        return 
false;
        break;
          }
    
        
$image_p imagecreatetruecolor($nw$nh);
        
imagecopyresampled($image_p$image$nx$ny$ox$oy$nw$nh$ow$oh);
        return 
$image_p;
      }
      }
  } 
// end function my_scale

  // returns true if the outputfile aready contains a fresh value
  
function outputfileisfresh($filename$outputfilename)
  {
    if (!
file_exists($filename)) return false;
    if (!(
$outputfilename!='')) return false;
    if (!
file_exists($outputfilename)) return false;
    if (
filemtime($filename)>filemtime($outputfilename)) return false;
    return 
true;
  }

  function 
redirecttosmallfile($outputfilename,$urlprefix)
  {
    
$host  $_SERVER['HTTP_HOST'];
    
header('Location: http://'.$host.'/'.$urlprefix.$outputfilename);
    exit;
  }

?>