Масштабирование и вывод изображений

23.09.2013

Для вывода и масштабирования изображений я использую две очень удобные функции, в связке с доработанным классом ucresizeimg.class.v2.0. Кроме изменения размеров изображения, накладывается фильтр SHARPEN, что делает миниатюру более четкой.

Я проводил сравнения создания миниатюр, сделанных данным методом и фотошопом, результаты меня порадовали. Победа осталась разумеется за фотошопом, но результат работы скрипта практически не отличается. А в 1 из 10 случае миниатюра сделанная скриптом даже оказалась более удачной. Но обо всем по порядку.

В файле init.php описаны две функции, чтобы ими можно было воспользоваться из любого места:

Получение массива, описывающего файл: getArImg


function getArImg($inputFile, $width = 0, $height = 0, $type = 'STRONG') {//CLASSIС вписывает, STRONG - обрезает
    if (is_numeric($inputFile)){
        $inputFile = CFile::GetFileArray($inputFile);
    } elseif(is_array($inputFile)){
        
    } elseif(is_string($inputFile) && file_exists($_SERVER['DOCUMENT_ROOT'].$inputFile)){
        $arFile = array();
        $arSize = getimagesize($_SERVER['DOCUMENT_ROOT'].$inputFile);
        $arFile['WIDTH'] = $arSize[0];
        $arFile['HEIGHT'] = $arSize[1];
        $arFile['FILE_SIZE'] = filesize($_SERVER['DOCUMENT_ROOT'].$inputFile);
        $arFile['SRC'] = $inputFile;
        $inputFile = $arFile;
    } else {
        return 0;
    }
    if ($inputFile){
        if (($width || $height) &&(
                ($width < $inputFile['WIDTH']) || ($height < $inputFile['HEIGHT']))
           ){//нужен ресайз
            require_once 'ucresizeimg.class.v2.0.php';
            $ucResizeImg = new C_ucResizeImg();
            $newArImg = $ucResizeImg->GetResized(array(
                'INPUT_FILE' => $inputFile['SRC'],
                'WIDTH' => $width,
                'HEIGHT' => $height,
                'RESIZE_MODE' => $type,
                'RETURN_COMPLEX' => TRUE,
                'DEBUG' => FALSE,
                'FILE_PREFIX' => $type.$width.'x'.$height.'_',
                'PATH_TO_SAVE' => 'upload/',
		'SHARPEN' => TRUE, 
		'QUALITY' => 100,
            ));
            $inputFile['WIDTH'] = $newArImg['WIDTH'];
            $inputFile['HEIGHT'] = $newArImg['HEIGHT'];
            $inputFile['FILE_SIZE'] = $newArImg['FILE_SIZE'];
            $inputFile['SRC'] = $newArImg['OUTPUT_FILE'];
        }
        return $inputFile;
    }
    return 0;   
}

На вход функции подается от 1 до 4 параметров:

$inputFile - входной файл, это может быть:

  • число - id файла (хранимого в инфоблоке Bitrix);
  • массив, описывающий файл, например полученный функцией CFile::GetFileArray($inputFile), такие массивы возвращают стандартные компоненты битрикс, например в поле 'PREVIEW_PICTURE';
  • строка - путь до файла относительно корневой директории сайта.

$width - требуемая ширина файла, или 0 (по умолчанию) - тогда масштабирование произойдет пропорционально по высоте.

$height - требуемая высота файла, или 0 (по умолчанию) - тогда масштабирование произойдет пропорционально по ширине.

Если высота и ширина не заданы, то изменение размеров происходить не будет.

$type - тип масштабирования, возможные варианты 'STRONG' (по умолчанию) или 'CLASSIС':

  • 'STRONG' - При масштабировании происходит обрезание краев у бОльшей стороны;
  • 'CLASSIС' - Изображение вписывается в указанные размеры, бОльшая сторона будет равна указанному размеру, а меньшая - будет меньше указанного размера.
  • Если при масштабировании пропорции исходного изображения и конечного совпадают, то у 'STRONG' и 'CLASSIС' будет одинаковый результат.

Вывод изображения в виде html. Функция showImg

Чтобы каждый раз не собирать html тег <img> была написана следующая функция:


function showImg($inputFile, $class='', $width = 0, $height = 0, $type = 'STRONG'){
    $inputFile =  getArImg($inputFile, $width, $height, $type);
    $res = '<img src="'.$inputFile['SRC'].'" width="'.$inputFile['WIDTH'].'" height="'.$inputFile['HEIGHT'].'"';
    if (strlen($class)){
        $res .= ' class="'.$class.'"';
    }
    $res .= '>';
    return $res;
}

Думаю данная функция пояснения не требует, она приведена здесь для полноты картины и может легко быть модифицирована под любые нужды

Класс ucresizeimg.class.v2.0

Очень удачный класс для работы с изображениями, огромное спасибо его автору. Здесь я добавил только наложение фильтра SHARPEN, чтобы миниатюры получались более четкими.

Скачать ucresizeimg.class.v2.0.php

Оставить комментарий:

Представьтесь пожалуйста:
Электронная почта:
Электронный адрес не публикуются
Текст сообщения:
Для подсветки кода, оборачивайте ваш код в теги <code></code>
Введите 5 цифр с картинки:

Рекомендую:

Поделюсь промокодами для хостинга TimeWeb!

Поддержать проект: