How to use
$imageresize = new ImageResize($file_src);
$imageresize->resizeImage(256, 256);
$blob_name = $randomFileName . '_256.jpg';
$save_name = $destinationDirectory . '/' . $blob_name;
$imageresize->saveImage($save_name, 100);
<?php | |
Class ImageResize { | |
// *** Class variables | |
private $image; | |
private $width; | |
private $height; | |
function __construct($fileName) { | |
// *** Open up the file | |
$this->image = $this->openImage($fileName); | |
// *** Get width and height | |
$this->width = imagesx($this->image); | |
$this->height = imagesy($this->image); | |
} | |
private function openImage($file) { | |
// *** Get extension | |
$extension = strtolower(strrchr($file, '.')); | |
switch ($extension) { | |
case '.jpg': | |
case '.jpeg': | |
$img = @imagecreatefromjpeg($file); | |
break; | |
case '.gif': | |
$img = @imagecreatefromgif($file); | |
break; | |
case '.png': | |
$img = @imagecreatefrompng($file); | |
break; | |
default: | |
$img = false; | |
break; | |
} | |
return $img; | |
} | |
public function resizeImage($newWidth, $newHeight, $option = "auto") { | |
// *** Get optimal width and height - based on $option | |
$optionArray = $this->getDimensions($newWidth, $newHeight, strtolower($option)); | |
$optimalWidth = $optionArray['optimalWidth']; | |
$optimalHeight = $optionArray['optimalHeight']; | |
// *** Resample - create image canvas of x, y size | |
$this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight); | |
imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height); | |
// *** if option is 'crop', then crop too | |
if ($option == 'crop') { | |
$this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight); | |
} | |
} | |
public function saveImage($savePath, $imageQuality = "100") { | |
// *** Get extension | |
$extension = strrchr($savePath, '.'); | |
$extension = strtolower($extension); | |
switch ($extension) { | |
case '.jpg': | |
case '.jpeg': | |
if (imagetypes() & IMG_JPG) { | |
imagejpeg($this->imageResized, $savePath, $imageQuality); | |
} | |
break; | |
case '.gif': | |
if (imagetypes() & IMG_GIF) { | |
imagegif($this->imageResized, $savePath); | |
} | |
break; | |
case '.png': | |
// *** Scale quality from 0-100 to 0-9 | |
$scaleQuality = round(($imageQuality / 100) * 9); | |
// *** Invert quality setting as 0 is best, not 9 | |
$invertScaleQuality = 9 - $scaleQuality; | |
if (imagetypes() & IMG_PNG) { | |
imagepng($this->imageResized, $savePath, $invertScaleQuality); | |
} | |
break; | |
// ... etc | |
default: | |
// *** No extension - No save. | |
break; | |
} | |
imagedestroy($this->imageResized); | |
} | |
private function getDimensions($newWidth, $newHeight, $option) { | |
switch ($option) { | |
case 'exact': | |
$optimalWidth = $newWidth; | |
$optimalHeight = $newHeight; | |
break; | |
case 'portrait': | |
$optimalWidth = $this->getSizeByFixedHeight($newHeight); | |
$optimalHeight = $newHeight; | |
break; | |
case 'landscape': | |
$optimalWidth = $newWidth; | |
$optimalHeight = $this->getSizeByFixedWidth($newWidth); | |
break; | |
case 'auto': | |
$optionArray = $this->getSizeByAuto($newWidth, $newHeight); | |
$optimalWidth = $optionArray['optimalWidth']; | |
$optimalHeight = $optionArray['optimalHeight']; | |
break; | |
case 'crop': | |
$optionArray = $this->getOptimalCrop($newWidth, $newHeight); | |
$optimalWidth = $optionArray['optimalWidth']; | |
$optimalHeight = $optionArray['optimalHeight']; | |
break; | |
} | |
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); | |
} | |
private function getSizeByFixedHeight($newHeight) { | |
$ratio = $this->width / $this->height; | |
$newWidth = $newHeight * $ratio; | |
return $newWidth; | |
} | |
private function getSizeByFixedWidth($newWidth) { | |
$ratio = $this->height / $this->width; | |
$newHeight = $newWidth * $ratio; | |
return $newHeight; | |
} | |
private function getSizeByAuto($newWidth, $newHeight) { | |
if ($this->height < $this->width) { | |
// *** Image to be resized is wider (landscape) | |
$optimalWidth = $newWidth; | |
$optimalHeight = $this->getSizeByFixedWidth($newWidth); | |
} elseif ($this->height > $this->width) { | |
// *** Image to be resized is taller (portrait) | |
$optimalWidth = $this->getSizeByFixedHeight($newHeight); | |
$optimalHeight = $newHeight; | |
} else { | |
// *** Image to be resizerd is a square | |
if ($newHeight < $newWidth) { | |
$optimalWidth = $newWidth; | |
$optimalHeight = $this->getSizeByFixedWidth($newWidth); | |
} else if ($newHeight > $newWidth) { | |
$optimalWidth = $this->getSizeByFixedHeight($newHeight); | |
$optimalHeight = $newHeight; | |
} else { | |
// *** Sqaure being resized to a square | |
$optimalWidth = $newWidth; | |
$optimalHeight = $newHeight; | |
} | |
} | |
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); | |
} | |
private function getOptimalCrop($newWidth, $newHeight) { | |
$heightRatio = $this->height / $newHeight; | |
$widthRatio = $this->width / $newWidth; | |
if ($heightRatio < $widthRatio) { | |
$optimalRatio = $heightRatio; | |
} else { | |
$optimalRatio = $widthRatio; | |
} | |
$optimalHeight = $this->height / $optimalRatio; | |
$optimalWidth = $this->width / $optimalRatio; | |
return array('optimalWidth' => $optimalWidth, 'optimalHeight' => $optimalHeight); | |
} | |
private function crop($optimalWidth, $optimalHeight, $newWidth, $newHeight) { | |
// *** Find center - this will be used for the crop | |
$cropStartX = ( $optimalWidth / 2) - ( $newWidth / 2 ); | |
$cropStartY = ( $optimalHeight / 2) - ( $newHeight / 2 ); | |
$crop = $this->imageResized; | |
//imagedestroy($this->imageResized); | |
// *** Now crop from center to exact requested size | |
$this->imageResized = imagecreatetruecolor($newWidth, $newHeight); | |
imagecopyresampled($this->imageResized, $crop, 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight, $newWidth, $newHeight); | |
} | |
} |