Page 1 of 1

Help needed with image width height and crop

Posted: Tue Jan 15, 2008 6:54 pm
by theCro
Hello everyone i've been using this php code to resize image 'on the fly' and it really rocks!

here's the code:

Code: Select all

<?php
header ("Content-type: image/jpeg");
/*
JPEG / PNG Image Resizer
Parameters (passed via URL):
 
img = path / url of jpeg or png image file
 
percent = if this is defined, image is resized by it's
          value in percent (i.e. 50 to divide by 50 percent)
 
w = image width
 
h = image height
 
constrain = if this is parameter is passed and w and h are set
            to a size value then the size of the resulting image
            is constrained by whichever dimension is smaller
 
Requires the PHP GD Extension
 
Outputs the resulting image in JPEG Format
 
By: Michael John G. Lopez - http://www.sydel.net
Filename : imgsize.php
*/
 
$img = $_GET['img'];
$percent = $_GET['percent'];
$constrain = $_GET['constrain'];
$w = $_GET['w'];
$h = $_GET['h'];
 
// get image size of img
$x = @getimagesize($img);
// image width
$sw = $x[0];
// image height
$sh = $x[1];
 
if ($percent > 0) {
    // calculate resized height and width if percent is defined
    $percent = $percent * 0.01;
    $w = $sw * $percent;
    $h = $sh * $percent;
} else {
    if (isset ($w) AND !isset ($h)) {
        // autocompute height if only width is set
        $h = (100 / ($sw / $w)) * .01;
        $h = @round ($sh * $h);
    } elseif (isset ($h) AND !isset ($w)) {
        // autocompute width if only height is set
        $w = (100 / ($sh / $h)) * .01;
        $w = @round ($sw * $w);
    } elseif (isset ($h) AND isset ($w) AND isset ($constrain)) {
        // get the smaller resulting image dimension if both height
        // and width are set and $constrain is also set
        $hx = (100 / ($sw / $w)) * .01;
        $hx = @round ($sh * $hx);
 
        $wx = (100 / ($sh / $h)) * .01;
        $wx = @round ($sw * $wx);
 
        if ($hx < $h) {
            $h = (100 / ($sw / $w)) * .01;
            $h = @round ($sh * $h);
        } else {
            $w = (100 / ($sh / $h)) * .01;
            $w = @round ($sw * $w);
        }
    }
}
 
$im = @ImageCreateFromJPEG ($img) or // Read JPEG Image
$im = @ImageCreateFromPNG ($img) or // or PNG Image
$im = @ImageCreateFromGIF ($img) or // or GIF Image
$im = false; // If image is not JPEG, PNG, or GIF
 
if (!$im) {
    // We get errors from PHP's ImageCreate functions...
    // So let's echo back the contents of the actual image.
    readfile ($img);
} else {
    // Create the resized image destination
    $thumb = @ImageCreateTrueColor ($w, $h);
    // Copy from image source, resize it, and paste to image destination
    @ImageCopyResampled ($thumb, $im, 0, 0, 0, 0, $w, $h, $sw, $sh);
    // Output resized image
    @ImageJPEG ($thumb);
}
?>
[SAVE FILE AS 'imgsize.php']

BUT, i wanted to add new function so when, for example if the image is 600x500 and i want it to be 300x120 ... now it crops and STRETCHES the image and it's unproportional.. what i want is to make it proportional even if it's needed to cut the edges to fit the 300x120 pixels size... hopefully you understood what i wanted.. anyway the code for view image is

http://www.yourwebsite.com/imgsize.php? ... nghrv2.jpg

i know i have to use http://bg2.php.net/imagecopy to crop the image as desired. but i do not know how to import it into my above posted code

someone please help, it's for my kid's soccer website, thanks alot! cheers! 8)

Re: Help needed with image width height and crop

Posted: Wed Jan 16, 2008 4:42 am
by Inkyskin
This is a function I made a long time ago, so it's a little rough - but it works. It takes an image and makes a SQUARE crop for thumbnails. I'm pretty sure you'd be able to modify it to make non square crops :)

Heres the function:

Code: Select all

function square_crop($new_name,$image_path,$max_size,$folder,$image_type){
    if($image_type == 'png'){
        $image_extension = '.png';
    } else {
        $image_extension = '.jpg';
    }
    $uploaddir = '/home/photos/';
    list($width, $height) = getimagesize($image_path);
    if($width <= $max_size && $height <= $max_size){
        copy($image_path, $uploaddir.$folder.'/'.$new_name.$image_extension);
    } else {
        if ($width > $height) {
            $src_w = $src_h = $height;
            $src_y = 0;
            $src_x = round(($width - $height) / 2);
        } else {
            $src_w = $src_h = $width;
            $src_x = 0;
            $src_y = round(($height - $width) / 2);
        }
        $filename = $image_path;
        $image_p = imagecreatetruecolor($max_size, $max_size);
        if($image_type == 'png'){
            $image = imagecreatefrompng($filename);
        } else {
            $image = imagecreatefromjpeg($filename);
        }
        imagecopyresampled($image_p, $image, 0, 0, $src_x, $src_y, $max_size, $max_size, $src_w, $src_h);
        if($image_type == 'png'){
            imagepng($image_p, $uploaddir.$folder.'/'.$new_name.$image_extension);
        } else {
            imagejpeg($image_p, $uploaddir.$folder.'/'.$new_name.$image_extension, 96);
        }
    }
}
Then you call it like so:

Code: Select all

square_crop('cropped_image',$uploadfile,50,'thumbs','jpg');
or
square_crop('cropped_image',$uploadfile,50,'thumbs','png');