Главная » API Битрикс » CFile » Водяной знак на изображениях через CFile в Битрикс

Водяной знак на изображениях через CFile в Битрикс

Схема автоматического нанесения водяного знака на изображения через обработчик события в 1С-Битрикс

Защита изображений товаров от копирования конкурентами или продвижение бренда через логотип на каждой фотографии — типичная причина добавлять водяной знак при загрузке. Разберём, как реализовать автоматическое нанесение водяного знака на изображения в 1С-Битрикс.

Обработчик события при сохранении файла

<?php

use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'main',
    'OnAfterFileSave',
    function ($fileId) {
        $file = CFile::GetByID($fileId)->Fetch();

        if (in_array($file['CONTENT_TYPE'], ['image/jpeg', 'image/png'], true)) {
            addWatermark($file);
        }
    }
);

Как и с автоматической конвертацией в WebP, обработчик события сохранения файла — правильное место для нанесения водяного знака на все новые загружаемые изображения без необходимости вызывать эту логику вручную в каждом месте кода, где происходит загрузка файла.

Нанесение водяного знака через GD

<?php

function addWatermark(array $file): void
{
    $sourcePath = $_SERVER['DOCUMENT_ROOT'] . '/' . $file['SUBDIR'] . '/' . $file['FILE_NAME'];
    $watermarkPath = $_SERVER['DOCUMENT_ROOT'] . '/local/assets/watermark.png';

    $image = $file['CONTENT_TYPE'] === 'image/jpeg'
        ? imagecreatefromjpeg($sourcePath)
        : imagecreatefrompng($sourcePath);

    $watermark = imagecreatefrompng($watermarkPath);
    $watermarkWidth = imagesx($watermark);
    $watermarkHeight = imagesy($watermark);

    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);

    $destX = $imageWidth - $watermarkWidth - 20;
    $destY = $imageHeight - $watermarkHeight - 20;

    imagecopy($image, $watermark, $destX, $destY, 0, 0, $watermarkWidth, $watermarkHeight);

    imagejpeg($image, $sourcePath, 90);

    imagedestroy($image);
    imagedestroy($watermark);
}

Библиотека GD, встроенная в PHP, позволяет наложить одно изображение (логотип с прозрачным фоном в формате PNG) поверх другого в заданной позиции — в примере водяной знак размещается в правом нижнем углу с отступом 20 пикселей от края.

Нужна помощь с Битрикс?





    Прозрачность водяного знака

    Для менее навязчивого водяного знака, не перекрывающего слишком сильно содержимое фотографии, используется полупрозрачное наложение через imagecopymerge вместо imagecopy, с указанием процента прозрачности, — это делает водяной знак заметным, но не мешающим разглядеть сам товар на фотографии.

    Оригинал изображения без водяного знака

    Стоит решить заранее, нужно ли сохранять оригинал изображения без водяного знака отдельно (например, для внутреннего использования или на случай пересмотра политики нанесения знака в будущем) — если водяной знак наносится поверх оригинального файла напрямую и перезаписывает его, оригинал без знака теряется безвозвратно, и позже отказаться от водяных знаков без потери качества будет невозможно без повторной загрузки исходных изображений.

    Применение только к новым загрузкам

    Как и с массовым заполнением alt или конвертацией в WebP, обработчик события затрагивает только новые загрузки — для уже существующего каталога изображений без водяного знака требуется отдельный разовый скрипт, проходящий по всем существующим файлам и применяющий ту же логику нанесения знака.

    Производительность при массовой загрузке

    Обработка изображения через GD — не бесплатная по времени операция, особенно для изображений большого разрешения, — при массовом импорте товаров с автоматическим нанесением водяного знака на каждое изображение стоит учитывать это дополнительное время выполнения в общем расчёте продолжительности импорта.

    Частые ошибки

    • Оригинал изображения перезаписывается водяным знаком без резервной копии. Невозможно отказаться от знака в будущем без потери исходного качества изображения.
    • Знак наносится полностью непрозрачным без учёта восприятия. Излишне перекрывает содержимое фотографии товара.
    • Существующий каталог не охвачен разовым скриптом. Только новые загрузки получают водяной знак, старые изображения остаются без него.

    Итог

    Автоматическое нанесение водяного знака через обработчик события сохранения файла и библиотеку GD закрывает задачу для новых загрузок без ручного вмешательства в каждое место кода. Для существующего каталога нужен отдельный разовый скрипт, а решение о сохранении оригинала без знака стоит принять заранее, поскольку перезапись файла делает откат к оригиналу без потери качества невозможным.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний