user979331
user979331

Reputation: 11861

PHP image resize cuts off my images

I have this function here.....

function create_thumbnail($source,$destination, $thumb_width) {
        $size = getimagesize($source);
        $width = $size[0];
        $height = $size[1];
        $x = 0;
        $y = 0;
        if($width> $height) {
            $x = ceil(($width - $height) / 2 );
            $width = $height;
        } elseif($height> $width) {
            $y = ceil(($height - $width) / 2);
            $height = $width;
        }
        $new_image = imagecreatetruecolor($thumb_width,$thumb_width)or die('Cannot Initialize new GD image stream');
        $extension = get_image_extension($source);
         if($extension=='jpg' || $extension=='jpeg') 
            $image = imagecreatefromjpeg($source); 
        if($extension=='gif') 
            $image = imagecreatefromgif($source); 
        if($extension=='png') 
            $image = imagecreatefrompng($source);   

        imagecopyresampled($new_image,$image,0,0,$x,$y,$thumb_width,$thumb_width,$width,$height);
        if($extension=='jpg' || $extension=='jpeg') 
           imagejpeg($new_image,$destination); 
        if($extension=='gif') 
            imagegif($new_image,$destination); 
        if($extension=='png') 
            imagepng($new_image,$destination); 
    }

And what this does it takes an image and resizes, but its not resizing the way I expected to, I was expecting it would take a wide image or a tall image or a normal size image and cut it off so it fits to that size, it does the resizing but it cuts off most of my images...I have been struggling with this for days and I cant seem to find a way to resize my images without cutting them off....I hope I can find some help and it would greatly appreciated...so, so tired....

For an example I have this image....

enter image description here

and when I ran that function for that image it returns this...

enter image description here

What I am expecting is that same image, just smaller.

I changed this part of my code...

imagecopyresampled($new_image,$image,0,0,0,0,$thumb_width,$thumb_width,$width,$height);

changed the $x and $y to '0' and '0' and this is what came up...

enter image description here

I close to what I am looking for but the full image is not there...it still gets cut off.

Upvotes: 1

Views: 1797

Answers (2)

fitorec
fitorec

Reputation: 4765

Other solution:

/**
 * Create a jpg thumbnail from a source
 **/
function create_thumbnail($source, $destination, $thumbWidth) {
    if (($info = getimagesize($source)) === FALSE)
        return null;
    switch ($info[2]) {
        case IMAGETYPE_GIF  : $src = imagecreatefromgif($source);  break;
        case IMAGETYPE_JPEG : $src = imagecreatefromjpeg($source); break;
        case IMAGETYPE_PNG  : $src = imagecreatefrompng($source);  break;
        default : null;
    }
    $width = $info[0];
    $height = $info[1];
    $widthDst = $thumbWidth;
    $heightDst = intval( $height * $thumbWidth / $width);
    $tmp = imagecreatetruecolor($widthDst, $heightDst);
    imagecopyresampled($tmp, $src, 0, 0, 0, 0, $widthDst, $heightDst, $width, $height);
    imagejpeg($tmp, $destination);
}

Upvotes: 1

mpratt
mpratt

Reputation: 1608

For what you want you can use this function:

function create_thumbnail($source, $destination, $thumbWidth)
{
    $extension = get_image_extension($source);
    $size = getimagesize($source);
    $imageWidth  = $newWidth  = $size[0];
    $imageHeight = $newheight = $size[1];

    if ($imageWidth > $thumbWidth || $imageHeight > $thumbWidth)
    {
        $newWidth  = $newHeight = $thumbWidth;
    }

    $newImage = imagecreatetruecolor($newWidth, $newHeight);

    switch ($extension)
    {
        case 'jpeg':
        case 'jpg':
            $imageCreateFrom = 'imagecreatefromjpeg';
            $store = 'imagejpeg';
            break;

        case 'png':
            $imageCreateFrom = 'imagecreatefrompng';
            $store = 'imagepng';
            break;

        case 'gif':
            $imageCreateFrom = 'imagecreatefromgif';
            $store = 'imagegif';
            break;

        default:
            return false;
    }

    $container = $imageCreateFrom($source);
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
    return $store($newImage, $destination);
}
var_dump(create_thumbnail('sample.jpg', 'sample_thumb_no_ratio.jpg', '255'));

However if you want to preserve the image ratio, you could use something like this:

function create_thumbnail_preserve_ratio($source, $destination, $thumbWidth)
{
    $extension = get_image_extension($source);
    $size = getimagesize($source);
    $imageWidth  = $newWidth  = $size[0];
    $imageHeight = $newheight = $size[1];

    if ($imageWidth > $thumbWidth || $imageHeight > $thumbWidth)
    {
        // Calculate the ratio
        $xscale = ($imageWidth/$thumbWidth);
        $yscale = ($imageHeight/$thumbWidth);
        $newWidth  = ($yscale > $xscale) ? round($imageWidth * (1/$yscale)) : round($imageWidth * (1/$xscale));
        $newHeight = ($yscale > $xscale) ? round($imageHeight * (1/$yscale)) : round($imageHeight * (1/$xscale));
    }

    $newImage = imagecreatetruecolor($newWidth, $newHeight);

    switch ($extension)
    {
        case 'jpeg':
        case 'jpg':
            $imageCreateFrom = 'imagecreatefromjpeg';
            $store = 'imagejpeg';
            break;

        case 'png':
            $imageCreateFrom = 'imagecreatefrompng';
            $store = 'imagepng';
            break;

        case 'gif':
            $imageCreateFrom = 'imagecreatefromgif';
            $store = 'imagegif';
            break;

        default:
            return false;
    }

    $container = $imageCreateFrom($source);
    imagecopyresampled($newImage, $container, 0, 0, 0, 0, $newWidth, $newHeight, $imageWidth, $imageHeight);
    return $store($newImage, $destination);
}
var_dump(create_thumbnail_preserve_ratio('sample.jpg', 'sample_thumb_with_ratio.jpg', '255'));

Upvotes: 3

Related Questions