Налаштування водяних знаків на фотографіях товарів 1С-Bitrix
Конкурент завантажує фотографії з каталогу та використовує їх у себе. Це відбувається саме тому, що на зображеннях немає ідентифікатора магазину. Водяний знак — мінімальна захист, але він працює як бар'єр для ледачого копіювання.
Де Bitrix обробляє зображення
Усі зображення в Bitrix проходять через модуль main, клас CFile. Зміна розміру та конвертація відбуваються при звертанні до методу CFile::ResizeImageGet() або при генерації мініатюри через компонент. Фізично оброблені файли кешуються в /upload/resize_cache/.
Водяний знак не вбудований у стандартний CFile. Bitrix надає клас \Bitrix\Main\Diag\Image та обгортку \Bitrix\Main\IO\File, але обробка водяного знака реалізована в окремому функціоналі — через параметри модуля main в адміністративній частині.
Вбудований механізм: параметри модуля main
В адміністративній частині (/bitrix/admin/settings.php?lang=uk&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/з правильними правами - Агент для масової обробки існуючих зображень
- Виключення: зображення певних категорій або брендів без водяного знака







