imagecopyresized

(PHP 3, PHP 4, PHP 5)

imagecopyresized -- 拷贝部分图像并调整大小

说明

bool imagecopyresized ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )

imagecopyresized() 将一幅图像中的一块正方形区域拷贝到另一个图像中。dst_imagesrc_image 分别是目标图像和源图像的标识符。如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。坐标指的是左上角。本函数可用来在同一幅图内部拷贝(如果 dst_imagesrc_image 相同的话)区域,但如果区域交迭的话则结果不可预知。

注: 因为调色板图像限制(255+1 种颜色)有个问题。重采样或过滤图像通常需要多于 255 种颜色,计算新的被重采样的像素及其颜色时采用了一种近似值。对调色板图像尝试分配一个新颜色时,如果失败我们选择了计算结果最接近(理论上)的颜色。这并不总是视觉上最接近的颜色。这可能会产生怪异的结果,例如空白(或者视觉上是空白)的图像。要跳过这个问题,请使用真彩色图像作为目标图像,例如用 imagecreatetruecolor() 创建的。

范例

例子 1. 调整图像大小

本例将以原来的一半大小显示图像。

<?php
// File and new size
$filename = 'test.jpg';
$percent = 0.5;

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

// Get new sizes
list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

// Resize
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

// Output
imagejpeg($thumb);
?>

图像将以一半大小输出,不过可以用 imagecopyresampled() 得到更好的质量。


add a note add a note User Contributed Notes
kyle dot florence at gmail dot com
16-Sep-2006 09:38
The function below will resize an image based on max width and height, then it will create a thumbnail image from the center of the resized image of a width and height specified.  This function will not resize the image to max_w pixels by max_h pixels, those are only the max width's and heights the image can be, it resizes the image to the first 1:1 ratio below max_w and max_h.

For example, if you have an image that is 800x600 and you specify your new image to be 400x200, it will resize based on the smallest number (in this case 200) and maintain the images 1:1 ratio.  So your final image would end up at something like 262x200.

UPDATE:  I have updated this function, I added the 'newdir' option in case you want the images saved in a different directory than the script.  I also fixed the thumbnail slice so it is perfectly in the center now and fixed the bug that 'ob at babcom dot biz' mentioned so you can safely resize based on width or height now.

<?
/**********************************************************
 * function resizejpeg:
 *
 *  = creates a resized image based on the max width
 *    specified as well as generates a thumbnail from
 *    a rectangle cut from the middle of the image.
 *
 *    @dir    = directory image is stored in
 *    @newdir = directory new image will be stored in
 *    @img    = the image name
 *    @max_w  = the max width of the resized image
 *    @max_h  = the max height of the resized image
 *    @th_w  = the width of the thumbnail
 *    @th_h  = the height of the thumbnail
 *
 **********************************************************/

function resizejpeg($dir, $newdir, $img, $max_w, $max_h, $th_w, $th_h)
{
  
// set destination directory
  
if (!$newdir) $newdir = $dir;

  
// get original images width and height
  
list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

  
// make sure image is a jpeg
  
if ($or_t == 2) {
  
      
// obtain the image's ratio
      
$ratio = ($or_h / $or_w);

      
// original image
      
$or_image = imagecreatefromjpeg($dir.$img);

      
// resize image?
      
if ($or_w > $max_w || $or_h > $max_h) {

          
// resize by height, then width (height dominant)
          
if ($max_h < $max_w) {
              
$rs_h = $max_h;
              
$rs_w = $rs_h / $ratio;
           }
          
// resize by width, then height (width dominant)
          
else {
              
$rs_w = $max_w;
              
$rs_h = $ratio * $rs_w;
           }

          
// copy old image to new image
          
$rs_image = imagecreatetruecolor($rs_w, $rs_h);
          
imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
       }
      
// image requires no resizing
      
else {
          
$rs_w = $or_w;
          
$rs_h = $or_h;

          
$rs_image = $or_image;
       }

      
// generate resized image
      
imagejpeg($rs_image, $newdir.$img, 100);

      
$th_image = imagecreatetruecolor($th_w, $th_h);

      
// cut out a rectangle from the resized image and store in thumbnail
      
$new_w = (($rs_w / 2) - ($th_w / 2));
      
$new_h = (($rs_h / 2) - ($th_h / 2));

      
imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

      
// generate thumbnail
      
imagejpeg($th_image, $newdir.'thumb_'.$img, 100);

       return
true;
   }

  
// Image type was not jpeg!
  
else {
       return
false;
   }
}
?>

Example:

<?php
$dir
= './';
$img = 'test.jpg';

resizejpeg($dir, '', $img, 600, 400, 300, 150);
?>

The example would resize the image 'test.jpg' into something 600x400 or less (retains the 1:1 ratio of the image) and creates the file 'thumb_test.jpg' at 300x150.
nworld3d at yahoo dot com
24-Aug-2006 08:06
Belows is the code snipet that allows you to resize a transparent PNG and composite it into another image.  The code is tested to work with PHP5.1.2, GD2, but I think it can also work with other versions of PHP and GD. 

The code has been commented to help you read through it.  The idea of resizing the transparent PNG image is to create a new destination image which is completely transparent then turn off the imageAlphaBlending of this new image so that when the PNG source file is copied, its alpha channel is still retained.

<?php
/**
 * Compose a PNG file over a src file.
 * If new width/ height are defined, then resize the PNG (and keep all the transparency info)
 * Author:  Alex Le - http://www.alexle.net
 */
function imageComposeAlpha( &$src, &$ovr, $ovr_x, $ovr_y, $ovr_w = false, $ovr_h = false)
{
   if(
$ovr_w && $ovr_h )
      
$ovr = imageResizeAlpha( $ovr, $ovr_w, $ovr_h );
      
  
/* Noew compose the 2 images */
  
imagecopy($src, $ovr, $ovr_x, $ovr_y, 0, 0, imagesx($ovr), imagesy($ovr) );   
}

/**
 * Resize a PNG file with transparency to given dimensions
 * and still retain the alpha channel information
 * Author:  Alex Le - http://www.alexle.net
 */
function imageResizeAlpha(&$src, $w, $h)
{
      
/* create a new image with the new width and height */
      
$temp = imagecreatetruecolor($w, $h);
      
      
/* making the new image transparent */
      
$background = imagecolorallocate($temp, 0, 0, 0);
      
ImageColorTransparent($temp, $background); // make the new temp image all transparent
      
imagealphablending($temp, false); // turn off the alpha blending to keep the alpha channel
      
       /* Resize the PNG file */
       /* use imagecopyresized to gain some performance but loose some quality */
      
imagecopyresized($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
      
/* use imagecopyresampled if you concern more about the quality */
       //imagecopyresampled($temp, $src, 0, 0, 0, 0, $w, $h, imagesx($src), imagesy($src));
      
return $temp;
}
?>
Example usage:

<?php
header
('Content-type: image/png');

/* Open the photo and the overlay image */
$photoImage = ImageCreateFromJPEG('images/MiuMiu.jpg');
$overlay = ImageCreateFromPNG('images/hair-trans.png');

$percent = 0.8;
$newW = ceil(imagesx($overlay) * $percent);
$newH = ceil(imagesy($overlay) * $percent);

/* Compose the overlay photo over the target image */
imageComposeAlpha( $photoImage, $overlay, 86, 15, $newW, $newH );

/* Open another PNG file, then resize and compose it */
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 10, 20, imagesx($watermark)/2, imagesy($watermark)/2 );

/**
 * Open the same PNG file then compose without resizing
 * As the original $watermark is passed by reference, it was resized already.
 * So we have to reopen it.
 */
$watermark = imagecreatefrompng('images/watermark.png');
imageComposeAlpha( $photoImage, $watermark, 80, 350);
Imagepng($photoImage); // output to browser

ImageDestroy($photoImage);
ImageDestroy($overlay);
ImageDestroy($watermark);
?>
ob at babcom dot biz
21-Aug-2006 07:32
Regarding the note and function of kyle.florence on August 3rd 2006:

I tried to use his function resizejpeg() for resizing images in my gallery. As far as I can tell it contains a small bug.

Resizing worked fine as long as I had the same maximum width and maximum height specified. Wanting all thumbnails to have the same height - so my images would appear in a straight line on my website both in portrait format and in landscape format - I soon encountered the problem that resizing with different values of maximum width and maximum height would not work proberly.

If you are using the script change the following 2 lines where the resized width and the resized height are calculated:

<?php
$rs_h
= $ratio * $max_h;
?>
should be:
<?php
$rs_h
= $ratio * $rs_w;
?>

and:
<?php
$rs_w
= $max_w / $ratio;
?>
should be:
<?php
$rs_w
= $rs_h / $ratio;
?>

The following function is based on Kyle Florence's function. I left out the thumbnail-part and rather added the possibiliy of defining a new dir and new filename for the image. If you need to resize and then create a thumbnail just run the function twice. Here, the thumbnail will contain the full picture and not a cutout of the original image.

The function supports JPG, GIF and PNG resizing. The quality in case of JPG is given to the function as the last parameter $Quality.

The variable names should speak for their usage.

<?php
function Resize($Dir,$Image,$NewDir,$NewImage,$MaxWidth,$MaxHeight,$Quality) {
  list(
$ImageWidth,$ImageHeight,$TypeCode)=getimagesize($Dir.$Image);
 
$ImageType=($TypeCode==1?"gif":($TypeCode==2?"jpeg":
             (
$TypeCode==3?"png":FALSE)));
 
$CreateFunction="imagecreatefrom".$ImageType;
 
$OutputFunction="image".$ImageType;
  if (
$ImageType) {
  
$Ratio=($ImageHeight/$ImageWidth);
  
$ImageSource=$CreateFunction($Dir.$Image);
   if (
$ImageWidth > $MaxWidth || $ImageHeight > $MaxHeight) {
     if (
$ImageWidth > $MaxWidth) {
        
$ResizedWidth=$MaxWidth;
        
$ResizedHeight=$ResizedWidth*$Ratio;
     }
     else {
      
$ResizedWidth=$ImageWidth;
      
$ResizedHeight=$ImageHeight;
     }       
     if (
$ResizedHeight > $MaxHeight) {
      
$ResizedHeight=$MaxHeight;
      
$ResizedWidth=$ResizedHeight/$Ratio;
     }     
    
$ResizedImage=imagecreatetruecolor($ResizedWidth,$ResizedHeight);
    
imagecopyresampled($ResizedImage,$ImageSource,0,0,0,0,$ResizedWidth,
                        
$ResizedHeight,$ImageWidth,$ImageHeight);
   }
   else {
    
$ResizedWidth=$ImageWidth;
    
$ResizedHeight=$ImageHeight;     
    
$ResizedImage=$ImageSource;
   }   
  
$OutputFunction($ResizedImage,$NewDir.$NewImage,$Quality);
   return
true;
  }   
  else
   return
false;
}
?>

Before calling the function support for JPG, PNG or GIF should be checked.
hodgman at ali dot com dot au
09-Aug-2006 07:37
Users of this function should be aware that this function can return false in certain circumstances! I am assuming this is an indicator of failure.

None of the example code displayed in these notes takes this into account, so all of these examples contain weaknesses that could crash a program if not used with care.

However, it is not documented what kinds situations will cause it to fail, and what side effects (if it is not atomic) occur if the operation fails, so we will have to wait for the documentation to be updated before this function can be used in rock-solid (crash-proof) code.

[[I posted this information earlier, but I phrased it as a question so it was removed by the editors]]
kyle(dot)florence(_[at]_)gmail(dot)com
04-Aug-2006 09:43
The function below will resize an image based on max width and height, then it will create a thumbnail image from the center of the resized image of a width and height specified.

<?php
/**********************************************************
 * function resizejpeg:
 *
 *  = creates a resized image based on the max width
 *    specified as well as generates a thumbnail from
 *    a rectangle cut from the middle of the image.
 *
 *    @dir  = directory image is stored in
 *    @img  = the image name
 *    @max_w = the max width of the resized image
 *    @max_h = the max height of the resized image
 *    @th_w  = the width of the thumbnail
 *    @th_h  = the height of the thumbnail
 *
 **********************************************************/

function resizejpeg($dir, $img, $max_w, $max_h, $th_w, $th_h)
{
  
// get original images width and height
  
list($or_w, $or_h, $or_t) = getimagesize($dir.$img);

  
// make sure image is a jpeg
  
if ($or_t == 2) {
  
      
// obtain the image's ratio
      
$ratio = ($or_h / $or_w);

      
// original image
      
$or_image = imagecreatefromjpeg($dir.$img);

      
// resize image
      
if ($or_w > $max_w || $or_h > $max_h) {

          
// first resize by width (less than $max_w)
          
if ($or_w > $max_w) {
              
$rs_w = $max_w;
              
$rs_h = $ratio * $max_h;
           } else {
              
$rs_w = $or_w;
              
$rs_h = $or_h;
           }

          
// then resize by height (less than $max_h)
          
if ($rs_h > $max_h) {
              
$rs_w = $max_w / $ratio;
              
$rs_h = $max_h;
           }

          
// copy old image to new image
          
$rs_image = imagecreatetruecolor($rs_w, $rs_h);
          
imagecopyresampled($rs_image, $or_image, 0, 0, 0, 0, $rs_w, $rs_h, $or_w, $or_h);
       } else {
          
$rs_w = $or_w;
          
$rs_h = $or_h;

          
$rs_image = $or_image;
       }
  
      
// generate resized image
      
imagejpeg($rs_image, $dir.$img, 100);

      
$th_image = imagecreatetruecolor($th_w, $th_h);

      
// cut out a rectangle from the resized image and store in thumbnail
      
$new_w = (($rs_w / 4));
      
$new_h = (($rs_h / 4));

      
imagecopyresized($th_image, $rs_image, 0, 0, $new_w, $new_h, $rs_w, $rs_h, $rs_w, $rs_h);

      
// generate thumbnail
      
imagejpeg($th_image, $dir.'thumb_'.$img, 100);

       return
true;
   }
  
  
// Image type was not jpeg!
  
else {
       return
false;
   }
}
?>

Example:

<?php
$dir
= './';
$img = 'test.jpg';

resizejpeg($dir, $img, 600, 600, 300, 150);
?>

The example would resize the image 'test.jpg' into something 600x600 or less (1:1 ratio) and create the file 'thumb_test.jpg' at 300x150.
06madsenl at westseneca dot wnyric dot org
21-Apr-2006 09:05
I was fiddling with this a few days trying to figure out how to resize the original images on my website, but this site:

http://www.sitepoint.com/article/image-resizing-php

Has a great tutorial on using PHP to resize images without creating thumbnails.  It was exactly what I was looking to do.
konteineris at yahoo dot com
16-Feb-2006 10:42
Function creates a thumbnail from the source image, resizes it so that it fits the desired thumb width and height or fills it grabbing maximum image part and resizing it, and lastly writes it to destination

<?

function thumb($filename, $destination, $th_width, $th_height, $forcefill)
{   
   list(
$width, $height) = getimagesize($filename);

  
$source = imagecreatefromjpeg($filename);

   if(
$width > $th_width || $height > $th_height){
    
$a = $th_width/$th_height;
    
$b = $width/$height;

     if((
$a > $b)^$forcefill)
     {
        
$src_rect_width  = $a * $height;
        
$src_rect_height = $height;
         if(!
$forcefill)
         {
          
$src_rect_width = $width;
          
$th_width = $th_height/$height*$width;
         }
     }
     else
     {
        
$src_rect_height = $width/$a;
        
$src_rect_width  = $width;
         if(!
$forcefill)
         {
          
$src_rect_height = $height;
          
$th_height = $th_width/$width*$height;
         }
     }

    
$src_rect_xoffset = ($width - $src_rect_width)/2*intval($forcefill);
    
$src_rect_yoffset = ($height - $src_rect_height)/2*intval($forcefill);

    
$thumb  = imagecreatetruecolor($th_width, $th_height);
    
imagecopyresized($thumb, $source, 0, 0, $src_rect_xoffset, $src_rect_yoffset, $th_width, $th_height, $src_rect_width, $src_rect_height);

    
imagejpeg($thumb,$destination);
   }
}

?>
jesse at method studios
05-Oct-2005 03:07
imagecopyresized() does not do any resampling.  This makes it extremely quick.  If quality is an issue, use imagecopyresampled().
MaLaZ
12-Aug-2005 10:24
simple script for creating thumbnails with process information and saving original ratio thumbnail to new destination...good then useing with upload or uploaded images:

<?php

//Upload------------------------------------
if(isset( $submit ))
{
if (
$_FILES['imagefile']['type'] == "image/jpeg"){
  
copy ($_FILES['imagefile']['tmp_name'], "../images/".$_FILES['imagefile']['name'])
   or die (
"Could not copy");
       echo
"";
       echo
"Image Name: ".$_FILES['imagefile']['name']."";
       echo
"<br>Image Size: ".$_FILES['imagefile']['size']."";
       echo
"<br>Image Type: ".$_FILES['imagefile']['type']."";
       echo
"<br>Image Copy Done....<br>";
       }
         else {
           echo
"<br><br>";
           echo
"bad file type (".$_FILES['imagefile']['name'].")<br>";exit;
             }
//-----upload end

//------start thumbnailer

  
$thumbsize=120;
   echo
"Thumbnail Info: <br>
         1.Thumb defined size: - OK: $thumbsize<br>"
;
  
$imgfile = "../images/$imagefile_name";//processed image
  
echo "
         2.Image destination: - OK: $imgfile<br>"
;
  
header('Content-type: image/jpeg');
   list(
$width, $height) = getimagesize($imgfile);
   echo
"3.Image size - OK: W=$width x H=$height<br>";
  
$imgratio=$width/$height;
   echo
"3.Image ratio - OK: $imgratio<br>";
   if (
$imgratio>1){
    
$newwidth = $thumbsize;
    
$newheight = $thumbsize/$imgratio;}
   else{
    
$newheight = $thumbsize;
    
$newwidth = $thumbsize*$imgratio;}
   echo
"4.Thumb new size -OK: W=$newwidth x H=$newheight<br>";
  
$thumb = ImageCreateTrueColor($newwidth,$newheight);
   echo
"5.TrueColor - OK<br>";
  
$source = imagecreatefromjpeg($imgfile);
   echo
"6.From JPG - OK<br>";
  
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  
imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);echo "7.Done... - OK<br>";
//-----------end--------------   
?>

or without any info, just resizing:

<?php
//------start thumbnailer
  
$thumbsize=120;
  
$imgfile = "../images/$imagefile_name";
  
header('Content-type: image/jpeg');
   list(
$width, $height) = getimagesize($imgfile);
  
$imgratio=$width/$height;
   if (
$imgratio>1){
    
$newwidth = $thumbsize;
    
$newheight = $thumbsize/$imgratio;}
   else{
    
$newheight = $thumbsize;
    
$newwidth = $thumbsize*$imgratio;}
  
$thumb = ImageCreateTrueColor($newwidth,$newheight);
  
$source = imagecreatefromjpeg($imgfile);
  
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
imagejpeg($thumb,"../images/thumbs/thumb_$imagefile_name",100);
//-----------end-------------- 
?>

i hope it helps.
FearINC at gmail dot com
11-Aug-2005 01:35
I wrote a function not long ago that creates a thumbnail out of a large picture. Unlike other notes on this page, the code is a function so it can be used many times on the same script. The function allows the programer to set max height and width and resizes the picture proportionally.
<?php
function saveThumbnail($saveToDir, $imagePath, $imageName, $max_x, $max_y) {
  
preg_match("'^(.*)\.(gif|jpe?g|png)$'i", $imageName, $ext);
   switch (
strtolower($ext[2])) {
       case
'jpg' :
       case
'jpeg': $im  = imagecreatefromjpeg ($imagePath);
                     break;
       case
'gif' : $im  = imagecreatefromgif  ($imagePath);
                     break;
       case
'png' : $im  = imagecreatefrompng  ($imagePath);
                     break;
       default    :
$stop = true;
                     break;
   }
  
   if (!isset(
$stop)) {
      
$x = imagesx($im);
      
$y = imagesy($im);
  
       if ((
$max_x/$max_y) < ($x/$y)) {
          
$save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
       }
       else {
          
$save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
       }
      
imagecopyresized($save, $im, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y);
      
      
imagegif($save, "{$saveToDir}{$ext[1]}.gif");
      
imagedestroy($im);
      
imagedestroy($save);
   }
}
?>

the function for now takes only jpg,gif and png files, but that can easily be changed.
It's an easy to use easy to understand function and I hope it will come useful to someone.
mecdesign at hotmail dot com
08-Aug-2005 05:51
This code will resize your images if your image needs to fit (without stretching) into a max height / width destination image that is not a 1:1 ratio (mine was 4:3).

<?
  
// Ratios
  
$image_ratio = $width / $height; // Actual image's ratio
  
$destination_ratio = $max_width / $max_height; // Ratio of dest. placeholder
  
   // Taller
  
if($image_ratio < $destination_ratio)
   {
      
//Too tall:
      
if($height > $max_height)
       {
          
$height = $max_height;
          
$width = ceil($height / $image_ratio);
       }
   }
  
// Wider / balanced & too wide:
  
else if ($width > $max_width)
   {
      
$width = $max_width;
      
$height = ceil($width / $image_ratio);
   }
?>
saurabh at saurabh dot com
22-Jul-2005 07:57
URGENT!

I am trying to make thumbnails of image(png, jpg, gif)...

Not a single code is working. Do we have to make any changes in php.ini?

which version of gd is required can anybody xplain me whole thing.
brian <dot> tyler <at> gmail <dot> com
12-Jun-2005 06:53
I spent last night getting unsuccessful results from this function until I found this note of fluffle <<at>> gmail on the imagecopyresampled page, I have made a slight modification, so you can just cut and paste.

Just to clarify that src_w and src_h do not necessarily need to be the source image width and height, as they specify the size of the rectangle cropped from the source picture, with its top left corner situated at (src_x, src_y).

For example, the code below crops a jpeg image to be square, with the square situated in the centre of the original image, and then resizes it to a 100x100 thumbnail.

function ($image_filename, $thumb_location, $image_thumb_size){
//@$image_filename - the filename of the image you want
//to get a thumbnail for (relative to location of this
//function).
//@$thumb_location - the url (relative to location of this
//function) to save the thumbnail.
//@$image_thumb_size - the x-y dimension of your thumb
//in pixels.

   list($ow, $oh) = getimagesize($image_filename);
   $image_original = imagecreatefromjpeg($image_filename);
   $image_thumb = imagecreatetruecolor($image_thumb_size,$image_thumb_size);
if ($ow > $oh) {
   $off_w = ($ow-$oh)/2;
   $off_h = 0;
   $ow = $oh;
} elseif ($oh > $ow) {
   $off_w = 0;
   $off_h = ($oh-$ow)/2;
   $oh = $ow;
} else {
   $off_w = 0;
   $off_h = 0;
}
imagecopyresampled($image_thumb, $image_original, 0, 0, $off_w, $off_h, 100, 100, $ow, $oh);

imagejpeg($image_thumb, $thumb_location);
}//end function
no at name dot com
18-May-2005 07:45
I was searching for script, that do not resize on the fly, but copy resized file to other place, so after long searches, i've done this function. I hope it will be usefull for someone:
(This is not original code, i'v taked it from somwhere and edited a ltl :)
<?php
function resize($cur_dir, $cur_file, $newwidth, $output_dir)
{
  
$dir_name = $cur_dir;
  
$olddir = getcwd();
  
$dir = opendir($dir_name);
  
$filename = $cur_file;
  
$format='';
   if(
preg_match("/.jpg/i", "$filename"))
   {
      
$format = 'image/jpeg';
   }
   if (
preg_match("/.gif/i", "$filename"))
   {
      
$format = 'image/gif';
   }
   if(
preg_match("/.png/i", "$filename"))
   {
      
$format = 'image/png';
   }
   if(
$format!='')
   {
       list(
$width, $height) = getimagesize($filename);
      
$newheight=$height*$newwidth/$width;
       switch(
$format)
       {
           case
'image/jpeg':
          
$source = imagecreatefromjpeg($filename);
           break;
           case
'image/gif';
          
$source = imagecreatefromgif($filename);
           break;
           case
'image/png':
          
$source = imagecreatefrompng($filename);
           break;
       }
      
$thumb = imagecreatetruecolor($newwidth,$newheight);
      
imagealphablending($thumb, false);
      
$source = @imagecreatefromjpeg("$filename");
      
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
      
$filename="$output_dir/$filename";
       @
imagejpeg($thumb, $filename);
   }
}
?>
call this function using
<?
resize
("./input folder", "picture_file_name", "width", "./output folder");
?>
del at kartoon dot net
05-May-2005 04:37
This snippet allows you to grab a thumbnail from the center of a large image.  This was used for a client photo gallery for art to give a teaser of the image to come (only a small portion).  You could get dynamic with this value.  I also put in a scaling factor in case you want to scale down first before chopping.

<?php
// The file
$filename = 'moon.jpg';
$percent = 1.0; // if you want to scale down first
$imagethumbsize = 200; // thumbnail size (area cropped in middle of image)
// Content type
header('Content-type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($imagethumbsize , $imagethumbsize);  // true color for best quality
$image = imagecreatefromjpeg($filename);

// basically take this line and put in your versin the -($new_width/2) + ($imagethumbsize/2) & -($new_height/2) + ($imagethumbsize/2) for
// the 2/3 position in the 3 and 4 place for imagecopyresampled
// -($new_width/2) + ($imagethumbsize/2)
// AND
// -($new_height/2) + ($imagethumbsize/2)
// are the trick
imagecopyresampled($image_p, $image, -($new_width/2) + ($imagethumbsize/2), -($new_height/2) + ($imagethumbsize/2), 0, 0, $new_width , $new_width , $width, $height);

// Output

imagejpeg($image_p, null, 100);
?>
development at lab-9 dot com
26-Apr-2005 06:35
If you read your Imagedata from a Database Blob and use the functions from above to resize the image to a thumbnail improving a lot of traffic, you will have to make temporary copies of the files in order that the functions can access them

Here a example:

// switch through imagetypes
$extension = "jpg";
if(mysql_result($query, 0, 'type') == "image/pjpeg")
{ $extension = "jpg"; } // overwrite
else if(mysql_result($query, 0, 'type') == "image/gif")
{ $extension = "gif"; } // overwrite

// get a temporary filename
// use microtime() to get a unique filename
// if you request more than one file f.e. by creating large numbers of thumbnails, the server could be not fast enough to save all these different files and you get duplicated copies and resizepics() will resize and output often the same content

$filename = microtime()."_temp.".$extension;

// open
$tempfile = fopen($filename, "w+");

// write
fwrite($tempfile, mysql_result($query, 0, 'image'));

// close
fclose($tempfile);

// resize and output the content
echo resizepics($filename, '100', '70');

// delete temporary file
unlink($filename);

NOTE: this script has to be put into a file which sends correct header informations to the browser, otherwise you won't get more to see than a big red cross :-)
robby at planetargon dot com
28-Feb-2005 11:56
Most of the examples below don't keep the proportions properly. They keep using if/else for the height/width..and forgetting that you might have a max height AND a max width, not one or the other.

/**
* Resize an image and keep the proportions
* @author Allison Beckwith <allison@planetargon.com>
* @param string $filename
* @param integer $max_width
* @param integer $max_height
* @return image
*/
function resizeImage($filename, $max_width, $max_height)
{
   list($orig_width, $orig_height) = getimagesize($filename);

   $width = $orig_width;
   $height = $orig_height;

   # taller
   if ($height > $max_height) {
       $width = ($max_height / $height) * $width;
       $height = $max_height;
   }

   # wider
   if ($width > $max_width) {
       $height = ($max_width / $width) * $height;
       $width = $max_width;
   }

   $image_p = imagecreatetruecolor($width, $height);

   $image = imagecreatefromjpeg($filename);

   imagecopyresampled($image_p, $image, 0, 0, 0, 0,
                                     $width, $height, $orig_width, $orig_height);

   return $image_p;
}
haker4o at haker4o dot org
27-Feb-2005 12:57
<?php
//                      Resize image.
//            Writeen By: Smelban & Haker4o
// Mails smelban@smwebdesigns.com & Haker4o@Haker4o.org
// This code is written to only execute on  jpg,gif,png     
// $picname = resizepics('pics', 'new widthmax', 'new heightmax');
// Demo  $picname = resizepics('stihche.jpg', '180', '140');
$picname = resizepics('picture-name.format', '180', '140');
echo
$pickname;
//Error
die( "<font color=\"#FF0066\"><center><b>File not exists :(<b></center></FONT>");
//Funcion resizepics
function resizepics($pics, $newwidth, $newheight){
     if(
preg_match("/.jpg/i", "$pics")){
          
header('Content-type: image/jpeg');
     }
     if (
preg_match("/.gif/i", "$pics")){
          
header('Content-type: image/gif');
     }
     list(
$width, $height) = getimagesize($pics);
     if(
$width > $height && $newheight < $height){
      
$newheight = $height / ($width / $newwidth);
     } else if (
$width < $height && $newwidth < $width) {
      
$newwidth = $width / ($height / $newheight);   
     } else {
      
$newwidth = $width;
      
$newheight = $height;
   }
   if(
preg_match("/.jpg/i", "$pics")){
  
$source = imagecreatefromjpeg($pics);
   }
   if(
preg_match("/.jpeg/i", "$pics")){
  
$source = imagecreatefromjpeg($pics);
   }
   if(
preg_match("/.jpeg/i", "$pics")){
  
$source = Imagecreatefromjpeg($pics);
   }
   if(
preg_match("/.png/i", "$pics")){
  
$source = imagecreatefrompng($pics);
   }
   if(
preg_match("/.gif/i", "$pics")){
  
$source = imagecreatefromgif($pics);
   }
  
$thumb = imagecreatetruecolor($newwidth, $newheight);
  
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   return
imagejpeg($thumb);
   if(
preg_match("/.jpg/i", "$pics")){
   return
imagejpeg($thumb);
   }
   if(
preg_match("/.jpeg/i", "$pics")){
   return
imagejpeg($thumb);
   }
   if(
preg_match("/.jpeg/i", "$pics")){
   return
imagejpeg($thumb);
   }
   if(
preg_match("/.png/i", "$pics")){
   return
imagepng($thumb);
   }
   if(
preg_match("/.gif/i", "$pics")){
   return
imagegif($thumb);
   }
 }
?>
smelban at smwebdesigns dot com
16-Feb-2005 12:37
Resize image proportionaly where you give a max width or max height

<?php
header
('Content-type: image/jpeg');
//$myimage = resizeImage('filename', 'newwidthmax', 'newheightmax');
$myimage = resizeImage('test.jpg', '150', '120');
print
$myimage;

function
resizeImage($filename, $newwidth, $newheight){
   list(
$width, $height) = getimagesize($filename);
   if(
$width > $height && $newheight < $height){
      
$newheight = $height / ($width / $newwidth);
   } else if (
$width < $height && $newwidth < $width) {
      
$newwidth = $width / ($height / $newheight);   
   } else {
      
$newwidth = $width;
      
$newheight = $height;
   }
  
$thumb = imagecreatetruecolor($newwidth, $newheight);
  
$source = imagecreatefromjpeg($filename);
  
imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
   return
imagejpeg($thumb);
}
?>
finnsi at centrum dot is
13-Feb-2005 09:30
If you need to delete or resize images in the filesystem (not in DB) without loosing the image quality...
I commented the code as much as possible so that newbies (like myself) will understand it.  ;)

<?php
  
  
/*
  
   WRITTEN BY:
   Finnur Eiriksson, (http://www.centrum.is/finnsi)
   Based on snippets that have been posted on www.PHP.net
   Drop me an e-mail if you have any questions.
  
   NOTE:
   This code is written to either delete or resize pictures in the file system, so if you have your pictures in a database
   you will have to make some changes. Also, if you are using other picture formats than .gif's or .jpg's you
   will have to add som code as well (Read the comments to find out where to do this).
  
   IMPORTANT:   
   The $_GET['resizepic'] variable only contains the NAME of the file that is going to be deleted/resized.
  
   The internet guest account (IUSR_SERVERNAME on WINDOWS) must have read and write permissions (execution permission not needed)
   in your image directory (i.e. $dir_name = "FooBar"). It is a good idea to have a separate directory for image