Настройка водяных знаков на фотографиях товаров 1С-Битрикс
Конкурент скачивает фотографии с каталога и использует их у себя. Это происходит именно потому, что на изображениях нет идентификатора магазина. Водяной знак — минимальная защита, но она работает как барьер для ленивого копирования.
Где Битрикс обрабатывает изображения
Все изображения в Битрикс проходят через модуль main, класс CFile. Ресайз и конвертация происходят при обращении к методу CFile::ResizeImageGet() или при генерации миниатюры через компонент. Физически обработанные файлы кешируются в /upload/resize_cache/.
Водяной знак не встроен в стандартный CFile. Битрикс предоставляет класс \Bitrix\Main\Diag\Image и обёртку \Bitrix\Main\IO\File, но обработка водяного знака реализована в отдельном функционале — через настройки модуля main в административной части.
Встроенный механизм: настройки модуля main
В административной части (/bitrix/admin/settings.php?lang=ru&mid=main) есть раздел «Водяные знаки». Параметры сохраняются в b_option с модулем main:
-
use_watermark_text— использовать текст как водяной знак -
use_watermark_image— использовать изображение -
watermark_text— текст водяного знака -
watermark_text_color— цвет в формате R,G,B -
watermark_text_size— размер шрифта -
watermark_position— позиция (TL, TC, TR, CL, CC, CR, BL, BC, BR) -
watermark_image_path— путь к файлу-изображению для водяного знака -
watermark_image_alpha— прозрачность (0–100)
Встроенный механизм применяет водяной знак при вызове CFile::ResizeImageGet() с параметром $bUseWatermark = true. Компонент bitrix:catalog.element по умолчанию не передаёт этот параметр — нужно явно указать в параметрах компонента или в шаблоне.
Программное наложение через GD
Для нестандартного позиционирования или динамического контента водяного знака (например, цена, дата) используется прямая работа с GD:
function applyWatermark(string $sourcePath, string $outputPath): void
{
$info = getimagesize($sourcePath);
$src = match($info[2]) {
IMAGETYPE_JPEG => imagecreatefromjpeg($sourcePath),
IMAGETYPE_PNG => imagecreatefrompng($sourcePath),
IMAGETYPE_WEBP => imagecreatefromwebp($sourcePath),
default => throw new \RuntimeException('Unsupported format'),
};
$wmPath = $_SERVER['DOCUMENT_ROOT'] . '/local/watermark.png';
$wm = imagecreatefrompng($wmPath);
$srcW = imagesx($src);
$srcH = imagesy($src);
$wmW = imagesx($wm);
$wmH = imagesy($wm);
// Позиция: правый нижний угол с отступом 10px
$destX = $srcW - $wmW - 10;
$destY = $srcH - $wmH - 10;
imagecopy($src, $wm, $destX, $destY, 0, 0, $wmW, $wmH);
match($info[2]) {
IMAGETYPE_JPEG => imagejpeg($src, $outputPath, 90),
IMAGETYPE_PNG => imagepng($src, $outputPath),
IMAGETYPE_WEBP => imagewebp($src, $outputPath, 85),
};
imagedestroy($src);
imagedestroy($wm);
}
Кеширование и производительность
Водяной знак не должен накладываться при каждом запросе. Обработанное изображение кешируется в /upload/watermarked/{$fileId}/ с именем, включающим хеш параметров водяного знака. При изменении логотипа или позиции — хеш меняется, кеш инвалидируется автоматически.
Для массовой обработки существующих изображений: агент или CLI-скрипт итерирует b_file по полю MODULE_ID = 'iblock' и обрабатывает файлы батчами по 50–100 штук. На 10 000 изображений при среднем размере 200 КБ обработка занимает 15–30 минут на нормальном сервере.
Что настраиваем
- Параметры встроенного водяного знака в
b_optionдля модуляmain - Передачу флага
bUseWatermarkв компонентах каталога - Кастомную функцию наложения через GD для нестандартных требований
- Директорию кеша
/upload/watermarked/с правильными правами - Агент для массовой обработки существующих изображений
- Исключение: изображения определённых категорий или брендов без водяного знака







