Скрипт изменения размера изображений в папке на php

Блог - PROMO64

Скрипт изменения размера изображений в папке и сжатие их.

 

<?php
$dir           = "images";  # Папка с изображениями
$new_width     = "1300";     # Новая ширина
$new_height    = "867";     # Новая высота
$jpeg_compress = "90";      # Степень сжатия

##############################################################

class resize {
    // *** Переменные класса 
    private $image;  
    private $width;  
    private $height;
    private $imageResized;
    
    public function __construct($fileName){
        // *** Открытие изобраение  
        $this->image = $this->openImage($fileName);  
 
        // *** Сохраняем ширину и высоту 
        $this->width  = imagesx($this->image);  
        $this->height = imagesy($this->image);
    }
    
    private function openImage($file)
{  
    // *** Получить расширение файла
    $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")  
{  
 
    // *** Получаем оптимальную ширину и высоту - зависит от параметра $option 
    $optionArray = $this->getDimensions($newWidth, $newHeight, strtolower($option));  
 
    $optimalWidth  = $optionArray['optimalWidth'];  
    $optimalHeight = $optionArray['optimalHeight'];  
 
    // *** Создаем холст изображения с измененными сторонами
    $this->imageResized = imagecreatetruecolor($optimalWidth, $optimalHeight);  
    imagecopyresampled($this->imageResized, $this->image, 0, 0, 0, 0, $optimalWidth, $optimalHeight, $this->width, $this->height);  
 
    // *** Если параметр $option = 'crop'(обрезка), то создаем соответствующий холст
    if ($option == 'crop') {  
        $this->crop($optimalWidth, $optimalHeight, $newWidth, $newHeight);  
    }  
}

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)  
    // *** Изображение является пейзажом  
    {  
        $optimalWidth = $newWidth;  
        $optimalHeight= $this->getSizeByFixedWidth($newWidth);  
    }  
    elseif ($this->height > $this->width)  
    // *** Изображение является портретом  
    {  
        $optimalWidth = $this->getSizeByFixedHeight($newHeight);  
        $optimalHeight= $newHeight;  
    }  
    else  
    // *** Квадрат  
    {  
        if ($newHeight < $newWidth) {  
            $optimalWidth = $newWidth;  
            $optimalHeight= $this->getSizeByFixedWidth($newWidth);  
        } else if ($newHeight > $newWidth) {  
            $optimalWidth = $this->getSizeByFixedHeight($newHeight);  
            $optimalHeight= $newHeight;  
        } else {  
            // *** Квадрат будет изменен на квадрат  
            $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)  
{  
    // *** Находим центр - это необходимо для обрезки
    $cropStartX = ( $optimalWidth / 2) - ( $newWidth /2 );  
    $cropStartY = ( $optimalHeight/ 2) - ( $newHeight/2 );  
 
    $crop = $this->imageResized;  
    //imagedestroy($this->imageResized);  
 
    // *** Теперь обрезаем от центра до указанного размера 
    $this->imageResized = imagecreatetruecolor($newWidth , $newHeight);  
    imagecopyresampled($this->imageResized, $crop , 0, 0, $cropStartX, $cropStartY, $newWidth, $newHeight , $newWidth, $newHeight);
}


public function saveImage($savePath, $imageQuality="100")  
{  
    // *** Получаем расширение
        $extension = strtolower(strrchr($savePath, '.')); 
 
    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':  
            // *** Переводим шкалу качества с 0 - 100 в 0 - 9  
            $scaleQuality = round(($imageQuality/100) * 9);  
 
            // *** Инвертируем качество.   
            $invertScaleQuality = 9 - $scaleQuality;  
 
            if (imagetypes() & IMG_PNG) {  
                imagepng($this->imageResized, $savePath, $invertScaleQuality);  
            }  
            break;  
 
        default:  
            // *** Нет расширение - не сохраняем.
            break;  
    }  
    // *** Освобождаем память, уничтожая переменную с изображением
    imagedestroy($this->imageResized);
    
}

}

function filelist($dir){
    $file_list = scandir($dir);
        unset($file_list[0]);
        unset($file_list[1]);
    $file_list = array_values($file_list);
    return $file_list;
}


$list = filelist($dir);
$n = count($list);

for($i=0;$i<$n;$i++){
    $resizeObj = new resize($dir."/".$list[$i]);
    $resizeObj -> resizeImage($new_width, $new_height, 'crop');
    $resizeObj -> saveImage($dir."/".$list[$i], $jpeg_compress);
}