Данный функционал предназначен для автоматического преобразования изображений — изменение размеров, обрезка, наложение водяного знака и т. д. При этом оригинальное изображение не модифицируется.
Возможности:
Данный функционал охватывает следующие типы полей:
Начиная с версии Netcat 5.9.0.18237 через переменную, которая содержит путь к картинке для определённого поля (например: $f_Image), можно задавать преобразования (примеры приведены ниже).
При выводе (при приведении к строке) переменной с преобразованиями будет сгенерирован путь к новому изображению, на основе оригинального изображения, сохранённого в соответствующем поле. При запросе по данному пути при первом запросе система создаст копию изображения и применит все указанные преобразования; полученное изображение будет сохранено по тому же сгенерированному пути, поэтому последующие запросы будут обрабатываться веб-сервером без участия скриптов.
Все сгенерированные на основе оригинала изображения хранятся в папке /netcat_files/generated/.
При изменении картинки, или при удалении поля, или объекта, или раздела и т. д., старые сгенерированные картинки для соответствующих полей будут удалены, тем самым всегда будут выводиться самые актуальные обработанные изображения, а старые сгенерированные изображения не будут лежать «мёртвым грузом». Также предусмотрена функция ручного удаления сгенерированных изображений.
Внимание! Перед использованием данного функционала необходима проверка на наличие данных в соответствующей переменной, иначе вызов метода приведёт к поломке сборки страницы. Актуально для всех полей, кроме «Множественная загрузка файлов».
| Поле с названием “Image” типа “Файл” в компоненте |
<? if ($f_Image) { ?>
<img src="<?= $f_Image->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Images” типа “Множественная загрузка” в компоненте |
<? foreach ($f_Images->to_array() as $image) { ?>
<img src="<?= $image->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Image” типа “Файл” в пользовательских настройках инфоблока |
<? if ($cc_settings['Image']) { ?>
<img src="<?= $cc_settings['Image']->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Image” типа “Файл” в пользовательских настройках макета дизайна |
<? if ($template_settings['Image']) { ?>
<img src="<?= $template_settings['Image']->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Image” типа “Файл” в системной таблице “Сайт” |
<? if ($current_catalogue['Image']) { ?>
<img src="<?= $current_catalogue['Image']->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Image” типа “Файл” в системной таблице “Раздел” |
<? if ($current_sub['Image']) { ?>
<img src="<?= $current_sub['Image']->resize(500, 500); ?>">
<? } ?> |
| Поле с названием “Image” типа “Файл” в системной таблице “Пользователь” |
<? if ($current_user['Image']) { ?>
<img src="<?= $current_user['Image']->resize(500, 500); ?>">
<? } ?> |
resize($width, $height, $type)
Изменение размера изображения.
| Параметр | Описание |
|---|---|
| $width | Ширина конечного изображения. |
| $height | Высота конечного изображения. |
| $type | Способ изменения размеров изображения. Доступные способы: Значение по умолчанию: |
crop($width, $height, $x, $y)
Обрезка изображения.
| Параметр | Описание |
|---|---|
| $width | Ширина конечного изображения. |
| $height | Высота конечного изображения. |
| $x | Координата по оси X левого верхнего угла, от которого будет происходить обрезка. |
| $y | Координата по оси Y левого верхнего угла, от которого будет происходить обрезка. |
watermark($http_path, $mode)
Наложение водяного знака на изображение.
| Параметр | Описание |
|---|---|
| $http_path | HTTP-путь (от корневой папки сайта) до файла водяного знака. Пример: watermark('netcat_files/watermark.png'); |
| $mode |
Режим наложения водяного знака. Доступные режимы: Значение по умолчанию: |
scale($factor)
Получение пути к масштабированной копии изображения.
| Параметр | Описание |
|---|---|
| $factor |
Фактор масштабирования исходного изображения. Пример: |
При использовании метода as_img() к тегу <img> автоматически добавляется атрибут srcset с путями к вариантам изображения с масштабами 1.5x, 2x, 3x и 4x. Это позволяет автоматически отображать на устройствах с дисплеем с высокой плотностью пикселей чёткую копию изображения.
Например, если картинка уменьшена до 100×100 точек, будут доступны варианты изображения с размерами 100×100 (например, для 21,5″ монитора с разрешением 1920×1080 и плотностью пикселей 102 ppi), 150×150 (например, для планшета Surface 3 с 204 ppi), 200×200 (например, для MacBook Pro 15 с 221 ppi), 300×300 (например, для Samsung Galaxy S5 с 432 ppi) и 400×400 (например, для Samsung Galaxy S6 с 576 ppi), из которых веб-браузером, в зависимости от возможностей устройства и соединения, будет выбрано наиболее подходящее.
Метод scale может понадобиться, если путь к масштабированному изображению нужен для каких-либо других целей — например, для формирования тега <picture> или CSS:
<?php
if ($f_Image) {
$resized_image = $f_Image->resize(320, 240);
$style = "
width: 320px;
height: 240px;
background-repeat: no-repeat;
background-image: url('{$resized_image}');
background-image: -webkit-image-set(
url('{$resized_image}') 1x,
url('{$resized_image->scale(2)}') 2x
);
";
echo '<div style="' . $style . '"></div>
}
as_img($attributes)
Выводит тег <img> для изображения.
| Параметр | Описание |
|---|---|
| $attributes |
Массив с атрибутами тега <img>. |
1. Простой вывод изображения из поля
<img src="<?= $f_Image; ?>">
2. Проверка на наличие данных
<? if ($f_Image) { ?>
<img src="<?= $f_Image; ?>">
<? } ?>
3. Вывод сразу с тегом "img"
<? if ($f_Image) { ?>
<?= $f_Image->as_img(); ?>
<? } ?>
4. Изменение размера изображения
<? if ($f_Image) { ?>
<?= $f_Image->resize(100, 100)->as_img(); ?>
<?= $f_Image->resize(100, 100, nc_ImageTransform::RESIZE_TO_HEIGHT_WITH_CROP)->as_img(); ?>
<? } ?>
5. Обрезка изображения
<? if ($f_Image) { ?>
<?= $f_Image
->crop(50, 50, 20, 20)
->as_img(array(
'title' => 'Обрезка квадрата 50×50 px с отступом от левого верхнего угла по 20 px'
)); ?>
<? } ?>
6. Наложение водяного знака
<? if ($current_user['Avatar']) { ?>
<?= $current_user['Avatar']->watermark('netcat_files/wm.png')->as_img(); ?>
<? } ?>
7. Копия изображения для экрана с высокой плотностью пикселей
<? if ($template_settings['HeaderImage']) { ?>
<?= $template_settings['HeaderImage']->resize(100, 100)->scale(2); ?>
<? } ?>
8. Комбинирование параметров
<? if ($f_Image) { ?>
<?= $f_Image->crop(300, 300)->resize(50, 50)->watermark('img.jpg')
->as_img(array('id' => 'some_id')); ?>
<? } ?>
Важно! Порядок выполнения обработки не зависит от порядка вызова методов, и заранее предопределён: сначала происходит изменение размера изображения, затем обрезка, затем наложение водяного знака. Если преобразование не задано методом — оно не выполняется.
Если есть необходимость ручного удаления сгенерированных изображений — можно воспользоваться методом
nc_image_generator::remove_generated_images($entity = null, $field = null, $object = null, $file = null)
| Параметр | Описание |
|---|---|
| $entity |
Сущность, для которой необходимо удалить обработанные копии изображений. Возможные значения:
|
| $field |
Поле в указанной сущности (компонент, системная таблица, пользовательские настройки). |
| $object |
ID объекта. |
| $file |
ID файла в поле «Множественная загрузка» (только для полей «Множественная загрузка» компонентов). |
Примеры использования
// Удаление всех изображений.
nc_image_generator::remove_generated_images();
// Удаление изображений компонента с ID 169.
nc_image_generator::remove_generated_images(169);
// Удаление всех изображений поля Image пользовательских настроек инфоблоков.
nc_image_generator::remove_generated_images('class_settings', 'Image');
// Удаление сгенерированных изображений из системной таблицы пользователя
// для пользователя с ID 3, из поля с ID 190.
nc_image_generator::remove_generated_images('user', 190, 3);
// Удаление сгенерированных изображений компонента с ID 344,
// из поля "Множественная загрузка" с ID 759,
// для объекта с ID 12, только для третьего изображения в поле.
nc_image_generator::remove_generated_images(344, 759, 12, 3);
nc_image_edit_inline() не нужна, в режиме редактирования форма визуального изменения файлового поля в компоненте автоматически генерируется для авторизованных пользователей, имеющих нужные права.<img> (не будет использован метод as_img(), и результат выполнения не помещён в тег), то изображения не будут сгенерированы системой и помещены в папку для сгенерированных изображений.