0

I've been looking all over the internet to find the solution for this. I'm using this SimpleImage.php class to resize an image that I found here (http://www.white-hat-web-design.co.uk/articles/php-image-resizing.php). So far everything works perfectly fine. If I try to re size the image to its specific height or width it is doing its job. However, this only works if I am trying to resize the image one at a time. Let's say the original size of my image is 1400x1100, and I want to resize its height to 800. This will give me a result of some numberx800. And vice versa.

My goal is to resize the image according to the MAX-WIDTH AND MAX-HEIGHT that I am passing.

Something like this:

$image = new SimpleImage();
          $image->load($image_url); 
          $image->resizeToWidthHeight(MAX-WIDTH, MAX-HEIGHT);
          $image->save('photo.png');

Here is my SimpleImage.php Class

<?php
    class SimpleImage {
     var $image;
     var $image_type;

     function load($filename) {
        $image_info = getimagesize($filename);
        $this->image_type = $image_info[2];
        if( $this->image_type == IMAGETYPE_JPEG ) {
            $this->image = imagecreatefromjpeg($filename);
        } elseif( $this->image_type == IMAGETYPE_GIF ) {
            $this->image = imagecreatefromgif($filename);
        } elseif( $this->image_type == IMAGETYPE_PNG ) {
            $this->image = imagecreatefrompng($filename);
        }
    }
    function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
        if( $image_type == IMAGETYPE_JPEG ) {
            imagejpeg($this->image,$filename,$compression);
        } elseif( $image_type == IMAGETYPE_GIF ) {
            imagegif($this->image,$filename);
        } elseif( $image_type == IMAGETYPE_PNG ) {
            imagepng($this->image,$filename);
        }
        if( $permissions != null) {
            chmod($filename,$permissions);
        }
    }

    function output($image_type=IMAGETYPE_JPEG) {
        if( $image_type == IMAGETYPE_JPEG ) {
            imagejpeg($this->image);
        } elseif( $image_type == IMAGETYPE_GIF ) {
            imagegif($this->image);
        } elseif( $image_type == IMAGETYPE_PNG ) {
            imageAlphaBlending($this->image, true);
            imageSaveAlpha($this->image, true);
            imagepng($this->image);
        }   
    }

    function getWidth() {
        return imagesx($this->image);
    }
    function getHeight() {
        return imagesy($this->image);
    }
    function resizeToHeight($height) {
        $ratio = $height / $this->getHeight();
        $width = $this->getWidth() * $ratio;
        $this->resize($width,$height);
    }
    function resizeToWidth($width) {
        $ratio = $width / $this->getWidth();
        $height = $this->getheight() * $ratio;
        $this->resize($width,$height);
    }
    function scale($scale) {
        $width = $this->getWidth() * $scale/100;
        $height = $this->getheight() * $scale/100;
        $this->resize($width,$height);
    }


    function resize($width,$height) {

        // ADDED CODE IS HERE - NOT SURE WHY IT DOESN'T WORK FOR PNG

        // Setup new image
        $new_image = imagecreatetruecolor($width, $height);
        // These parameters are required for handling PNG files.
        imagealphablending($new_image, false);
        imagesavealpha($new_image,true);
        $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
        imagefilledrectangle($new_image, 0, 0, $width, $height, $transparent);
        // Resize image
        imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
        $this->image = $new_image;
    }
}

?>
Bono
  • 513
  • 2
  • 7
  • 10

1 Answers1

0

If the dimensions of your image change: you go from 3:4 to 16:9, you need to apply some cropping somewhere.

Figure out which dimension is the smallest based on the scale, resize on that property and then crop the other dimension.


In my experience scale is always wrong. I suggest you remove it from the library. resize + crop is the way to go.

You could write a function a like cropTo($newX, $newY)

Halcyon
  • 57,230
  • 10
  • 89
  • 128