Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP - Create Thumbnail & maintaining aspect ratio

EDIT: This can be easily done in CSS, I didn't know CSS much at the time of writing this

enter image description here

I have created a thumbnail creator using PHP. The thumbnails generated should be of the same size. But the problem is the use of uploads images having different aspect ratio like landscape or portrait the thumbnail becomes ugly. So I created the picture above for clarification. Whatever be the uploaded image, it will be put into a rectangle image. So the aspect ratio doesn't change and thumbnails will be of the same size. Can anyone pls help me or tell some ideas?

like image 372
Gijo Varghese Avatar asked Apr 18 '14 06:04

Gijo Varghese


2 Answers

define('THUMBNAIL_IMAGE_MAX_WIDTH', 150);
define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150);

function generate_image_thumbnail($source_image_path, $thumbnail_image_path)
{
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path);
    switch ($source_image_type) {
        case IMAGETYPE_GIF:
            $source_gd_image = imagecreatefromgif($source_image_path);
            break;
        case IMAGETYPE_JPEG:
            $source_gd_image = imagecreatefromjpeg($source_image_path);
            break;
        case IMAGETYPE_PNG:
            $source_gd_image = imagecreatefrompng($source_image_path);
            break;
    }
    if ($source_gd_image === false) {
        return false;
    }
    $source_aspect_ratio = $source_image_width / $source_image_height;
    $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT;
    if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) {
        $thumbnail_image_width = $source_image_width;
        $thumbnail_image_height = $source_image_height;
    } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) {
        $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio);
        $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT;
    } else {
        $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH;
        $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio);
    }
    $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height);
    imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height);

    $img_disp = imagecreatetruecolor(THUMBNAIL_IMAGE_MAX_WIDTH,THUMBNAIL_IMAGE_MAX_WIDTH);
    $backcolor = imagecolorallocate($img_disp,0,0,0);
    imagefill($img_disp,0,0,$backcolor);

        imagecopy($img_disp, $thumbnail_gd_image, (imagesx($img_disp)/2)-(imagesx($thumbnail_gd_image)/2), (imagesy($img_disp)/2)-(imagesy($thumbnail_gd_image)/2), 0, 0, imagesx($thumbnail_gd_image), imagesy($thumbnail_gd_image));

    imagejpeg($img_disp, $thumbnail_image_path, 90);
    imagedestroy($source_gd_image);
    imagedestroy($thumbnail_gd_image);
    imagedestroy($img_disp);
    return true;
}

generate_image_thumbnail('original_image.jpg', 'thumb_image.jpg'); //call the function

with that code, you will get something similar to

enter image description here

like image 60
kraysak Avatar answered Nov 19 '22 18:11

kraysak


Look at the source code of my Mr Thumb Image Resizing. :)

public function proportion($max_width, $max_height) {

    if (!( $this->halt )) {
        if ($this->image['extension'] == 'gif') {
            $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height / $this->image['height'];
            if ($this->image['width'] > $max_width || $this->image['height'] > $max_height) {
                $new_width = $this->image['width'] * $this->image['ratio'];
                $new_height = $this->image['height'] * $this->image['ratio'];
            } else {
                $new_width = $this->image['width'];
                $new_height = $this->image['height'];
            }
            $this->image['composite'] = imagecreatetruecolor($new_width, $new_height);
            imagecopyresampled($this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height']);
            $this->image['colorcount'] = imagecolorstotal($this->image['render']);
            imagetruecolortopalette($this->image['composite'], true, $this->image['colorcount']);
            imagepalettecopy($this->image['composite'], $this->image['render']);
            $this->image['transparentcolor'] = imagecolortransparent($this->image['render']);
            imagefill($this->image['composite'], 0, 0, $this->image['transparentcolor']);
            imagecolortransparent($this->image['composite'], $this->image['transparentcolor']);
        } else {
            $this->image['ratio'] = ( $this->image['width'] > $this->image['height'] ) ? $max_width / $this->image['width'] : $max_height / $this->image['height'];
            if ($this->image['width'] > $max_width || $this->image['height'] > $max_height) {
                $new_width = $this->image['width'] * $this->image['ratio'];
                $new_height = $this->image['height'] * $this->image['ratio'];
            } else {
                $new_width = $this->image['width'];
                $new_height = $this->image['height'];
            }
            $this->image['composite'] = imagecreatetruecolor($new_width, $new_height);
            imagecopyresampled($this->image['composite'], $this->image['render'], 0, 0, 0, 0, $new_width, $new_height, $this->image['width'], $this->image['height']);
        }
    } else {
        echo 'Execution halted!';
    }
}
like image 1
WASasquatch Avatar answered Nov 19 '22 16:11

WASasquatch