Начиная с версии 5.9.0.18235 в Неткэте также поддерживаются функции автоматической обработки изображений, загружаемых в поля компонентов, системных таблиц и визуальных настроек.
Начиная с версии 6.1.0.21164 в Неткэте добавлена поддержка обработки изображений в формате WebP, но только для PHP версии 5.4+.
Доступность: везде, при подключении соответствующего файла
Класс предназначен для работы с изображениями и содержит набор статических методов.
Класс автоматически загружается в действиях после добавления и изменения объекта. Чтобы загрузить его в других местах, нужно подключить файл nc_imagetransform.class.php.
Сделать это можно следующем способом:
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
$INCLUDE_FOLDER, если она не определена. Перед подключением должна быть объявлена как глобальная.
string imgResize($src_img, $dest_img, $width, $height, $mode=0, $format='jpg', $quality=null, $message_id = 0, $field = 0, $color = ''ffffff')
Публичный статический метод служит для изменения размера изображения.
| Параметры | Описание |
|---|---|
| $src_img | путь к исходному изображению |
| $dest_img | путь к создаваемому изображению |
| $width | ширина создаваемого изображения |
| $height | высота создаваемого изображения |
| $mode (опционально) | режим уменьшения: 0 — пропорционально уменьшает (по умолчанию); 1 — вписывает в указанные размеры с обрезкой; 3 — аналогично 1, но с приоритетов по ширине; 4 — аналогично 1 но с приоритетом по высоте; |
| $format (опционально) | формат изображения: NULL, 'jpg', 'gif', 'png', 'webp' . Если значение параметра равно NULL (рекомендуется), формат изображения будет определен автоматически. Ввиду того, что библиотека gd не имеет встроенной поддержки bmp, обработка изображений данного формата более длительная и создает большую нагрузку на сервер, чем обработка изображений других форматов. |
| $quality (опционально) | качество сжатия изображения при формате «jpg», «webp» и «png». Может принимать значения от 0 до 100 для «jpg» или «webp» и от 0 до 9 для «png». По умолчанию — 90 для «jpg» или «webp» и 6 для «png». |
| $message_id (опционально) | номер объекта, к которому относится файл |
| $field (опционально) | номер поля или его имя, к которому относится файл |
| $color (опционально) | цвет заливки полей изображения при режиме уменьшения $mode = 3 |
Последние два параметра нужны при изменение файлов объектов или пользователей для обновления записей в таблицах.
Пример использования:
1. Необходимо уменьшить аватар пользователя (поле ForumAvatar) до размеров 120 на 120.
В действиях после добавления/изменения пользователя нужно написать:
// разрываем html-код для вставки php-кода
// подключаем класс
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
// определяем текущий аватар
$photo_path = nc_file_path('User', $message, 'ForumAvatar', "");
// при наличии аватара
if ($photo_path) {
$photo_path .= $DOCUMENT_ROOT;
// вызываем статический метод класса
nc_ImageTransform::imgResize($photo_path,$photo_path,'120', '120', 0, 'jpg', 90, $message, 'ForumAvatar');
}
2. Необходимо изменить размер изображения объекта. Имя поля — Photo:
В действиях после добавления нужно написать:
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
$photo_path = nc_file_path($classID, $message, 'Photo', "");
if ($photo_path) {
$photo_path .= $DOCUMENT_ROOT;
nc_ImageTransform::imgResize($photo_path,$photo_path,'120', '120', 0, 'jpg', 90, $message, 'Photo');
}
3. Необходимо изменить размер изображения объекта с приоритетом по ширине и залить получившиеся поля желтым цветом. Имя поля — Photo:
В действиях после добавления нужно написать:
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
$photo_path = nc_file_path($classID, $message, 'Photo', "");
if ($photo_path) {
$photo_path .= $DOCUMENT_ROOT;
nc_ImageTransform::imgResize($photo_path,$photo_path,'120', '120', 3, 'jpg', 90, $message, 'Photo', 'ffff00');
}
bool createThumb($src_img, $dest_img, $width, $height, $mode=0, $format='jpg', $quality=null)
Публичный статический метод для создания копии изображении с возможностью изменения ее размеров (создание превью).
| Параметры | Описание |
|---|---|
| $src_img | путь к исходному изображению |
| $dest_img | путь к создаваемому изображению |
| $width | ширина создаваемого изображения |
| $height | высота создаваемого изображения |
| $mode (опционально) | режим уменьшения: 0 — пропорционально уменьшает (по умолчанию); 1 — вписывает в указанные размеры |
| $format (опционально) | формат изображения: NULL, 'jpg', 'gif', 'png', 'webp' или 'bmp'. Если значение параметра равно NULL (рекомендуется), формат изображения будет определен автоматически. Ввиду того, что библиотека gd не имеет встроенной поддержки bmp, обработка изображений данного формата более длительная и создает большую нагрузку на сервер, чем обработка изображений других форматов. |
| $quality (опционально) | качество сжатия изображения при формате «jpg», «webp» и «png». Может принимать значения от 0 до 100 для «jpg» или «webp» и от 0 до 9 для «png». По умолчанию — 90 для «jpg» или «webp» и 6 для «png». |
Пример использования:
При добавлении объекта с изображением (например, фотогалерея) создать превью размером 50 на 50.
Имя поля с изображением — Picture.
Имя поля для превью — Preview.
В действие после добавления объекта нужно прописать:
// если файл был закачан
if ($_FILES['f_Picture'][size] != 0 ) {
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
// создать превью
nc_ImageTransform::createThumb('Picture','Preview',50,50);
}
bool putWatermark ( $classID, $field, $message, $watermark, $mode = 0, $quality = null )
Публичный статический метод для наложения водяного знака (watermark, ватермарк) на изображение объекта.
| Параметры | Описание |
|---|---|
| $classID | номер компонента или имя системной таблицы |
| $field | номер поля или его латинское название |
| $message | номер объекта |
| $watermark | абсолютный или относительный путь до водяного знака |
| $mode (опционально) | местоположение знака: 0 — по центру; 1 — левый верхний угол; 2 — правый верхний угол; 3 — левый нижний угол; 4 — правый нижний угол. |
| $quality (опционально) | качество сжатия изображения при формате «jpg», «webp» и «png». Может принимать значения от 0 до 100 для «jpg» или «webp» и от 0 до 9 для «png». По умолчанию — 90 для «jpg» или «webp» и 6 для «png». |
Пример использования:
Есть компонент с полем Picture, при добавление объекта с изображением
надо наложить ватермарк. В действии после добавления пишем:
nc_ImageTransform::putWatermark($classID,'Picture',$message, '/images/netcat.png', 1 );
Путь до ватермарка может быть как абсолютным, так и относительным от корневой директории сайта.
bool putWatermark_file ( $filepath, $watermark, $mode = 0, $quality = null )
Публичный статический метод для наложения ватермарка на файл.
| Параметры | Описание |
|---|---|
| $filepath | абсолютный или относительный путь до файла |
| $watermark | абсолютный или относительный путь до водяного знака |
| $mode (опционально) | местоположение знака: 0 — по центру; 1 — левый верхний угол; 2 — правый верхний угол; 3 — левый нижний угол; 4 — правый нижний угол. |
| $quality (опционально) | качество сжатия изображения при формате «jpg», «webp» и «png». Может принимать значения от 0 до 100 для «jpg» или «webp» и от 0 до 9 для «png». По умолчанию — 90 для «jpg» или «webp» и 6 для «png». |
Пример использования (версия NetCat 5.7.0.16240+):
При добавлении и изменении объекта наложить водяной знак на правый нижний угол только новых картинок в поле типа множественная загрузка файлов.
Имя поля с изображениями — Images.
В действие после добавления (или изменения) объекта нужно прописать:
if (is_array($f_Images->records)) {
require_once($INCLUDE_FOLDER . "classes/nc_imagetransform.class.php");
foreach ($f_Images->records as $record) {
// Добавляем водяной знак, если изображение было только что загружено
if ($record->is_new()) {
nc_ImageTransform::putWatermark_file($record['Path'], '/img/watermark.png', 4);
}
}
}
Комментарии 7
$photo_path = $DOCUMENT_ROOT.nc_file_path($classID, $message, 'Photo', "");
if ( $photo_path) {
nc_ImageTransform::imgResize($photo_path,$photo_path,'120', '120', 0, 'jpg', 90, $message, 'Photo');
}
Тут ошибка: поскольку при составлении $photo_path используется переменная $DOCUMENT_ROOT, даже если файла нет, (bool) $photo_path будет true и nc_ImageTransform::imgResize выполнится.
Нужно убирать $DOCUMENT_ROOT внутрь if.
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
nc_ImageTransform::putWatermark($classID,'img1',$message, '/images/netcat.png', 1 );
и ничего не происходит
Ошибка логики в /netcat/require/classes/nc_imagetransform.class.php
http://joxi.ru/Dr899QH40n3Rm6
Для 5.6 и ниже работает следующий пример:
____________________________________________
Номер поля выбора фотографий - 1569, замените на своё!
global $nc_core;
$records = $nc_core->db->get_col("SELECT Path FROM Multifield WHERE Message_ID = {$message} && Field_ID = 1569 ORDER BY ID LIMIT ".$f_Photo->count().",999");
if (is_array($records)) {
require_once($INCLUDE_FOLDER . "classes/nc_imagetransform.class.php");
foreach ($records as $record)
nc_ImageTransform::putWatermark_file($record, '/imgs/watermark.png', 4);
}
__________________________________________
Если в поле уже заданы размеры для уменьшения изображения, то это будет применено:
$res = $nc_core->files->field_save_file(
$class_id, $field, $message_id, array('path'=> $photo_path ));
В path можно указать путь от корня сайта или url.