Масштабирование и вывод изображений
Для вывода и масштабирования изображений я использую две очень удобные функции, в связке с доработанным классом 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, чтобы миниатюры получались более четкими.
Оставить комментарий: