PHP - creating thumbnails and maintaining proportions

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

enter image description here

I created a thumbnail creator using PHP. Thumbnails created must be the same size. But the problem is the use of downloadable images with different aspect ratios, such as landscape or portrait, the thumbnail becomes ugly. So I created the picture above for clarification. Whatever image is uploaded, it will be placed in a rectangular image. Thus, the aspect ratio does not change, and the thumbnails will be the same size. Can someone please help me or tell me some ideas?

+4
4
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

-

enter image description here

+9

Thumb Image Resize.:)

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!';
    }
}
+1

, . , , , .

public static function makeThumb($src, $dest, $desired_width, $format = 'image/jpeg')
{
    /* read the source image */
    $source_image = null;
    if($format == 'image/jpeg')
    {
        $source_image = imagecreatefromjpeg($src);
    }
    else if($format == 'image/png')
    {
        $source_image = imagecreatefrompng($src);
    }

    $width = imagesx($source_image);
    $height = imagesy($source_image);

    /* find the "desired height" of this thumbnail, relative to the desired width  */
    $desired_height = floor($height * ($desired_width / $width));

    /* create a new, "virtual" image */
    $virtual_image = imagecreatetruecolor($desired_width, $desired_height);

    imageAlphaBlending($virtual_image, false);
    imageSaveAlpha($virtual_image, true);

    /* copy source image at a resized size */
    imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);

    /* create the physical thumbnail image to its destination */
    if($format == 'image/jpeg')
    {
        imagejpeg($virtual_image, $dest);
    }
    else if($format == 'image/png')
    {
        imagepng($virtual_image, $dest);
    }
}
0

API ImageMagick.

define('THUMB_WIDTH', 60);
define('THUMB_HEIGHT', 80);
define('MAGICK_PATH','/usr/local/bin/');

function makeThumbnail($in, $out) {
    $width = THUMB_WIDTH;
    $height = THUMB_HEIGHT;
    list($w,$h) = getimagesize($in);

    $thumbRatio = $width/$height;
    $inRatio = $w/$h;
    $isLandscape = $inRatio > $thumbRatio;

    $size = ($isLandscape ? '1000x'.$height : $width.'x1000');
    $xoff = ($isLandscape ? floor((($inRatio*$height)-$width)/2) : 0);
    $command = MAGICK_PATH."convert $in -resize $size -crop {$width}x{$height}+{$xoff}+0 ".
        "-colorspace RGB -strip -quality 90 $out";

    exec($command);
}

Refer to this link - http://coffeeshopped.com/2009/01/creating-image-thumbnails-using-php-and-imagemagick or http://in1.php.net/manual/en/class.imagick.php

0
source

Source: https://habr.com/ru/post/1537051/


All Articles