Главная страница / Блог / Автоматическое уменьшение изображений внутри статьи в 1С-Битрикс
1С-Битрикс

Автоматическое уменьшение изображений внутри статьи в 1С-Битрикс

30 июня 2026 7 минут чтения 3013 просмотров

Стандартный метод CFile::ResizeImageGet() отлично работает, если известен ID изображения. Но при работе с детальным описанием возникает проблема — внутри DETAIL_TEXT изображения обычно вставляются обычными тегами <img src=""> , а получить их ID средствами Битрикса уже не получится.

Из-за этого многие задаются вопросом: «Можно ли автоматически уменьшать изображения, если они уже вставлены в статью через тег <img src="">

Да, можно. Ниже рассмотрим решение, которое автоматически находит все изображения внутри HTML-кода статьи, определяет их ID по адресу файла, создает уменьшенные копии через CFile::ResizeImageGet() и подменяет ссылки на оптимизированные версии прямо перед выводом страницы.

Как работает

Алгоритм работы достаточно простой:

  • находит все теги <img> внутри текста статьи;
  • получает путь к изображению из атрибута src;
  • определяет ID файла в таблице b_file;
  • создает уменьшенную копию через CFile::ResizeImageGet();
  • заменяет путь к оригинальному изображению на уменьшенную версию;
  • при необходимости позволяет исключить отдельные изображения из обработки.

Готовое решение

Добавьте следующие функции в файл /bitrix/php_interface/init.php или в любое другое место, доступное шаблонам сайта.

// Изменение размера всех изображений внутри HTML
function resizeInlineImages($detailText)
{
    if (CModule::IncludeModule('main'))
    {
        $detailText = preg_replace_callback(
            '/(<img[^>]+src="([^"]+)"[^>]*>)/i',
            'resizeImageCallback',
            $detailText
        );
    }

    return $detailText;
}

// Получение ID файла по его пути
function getFileIdBySrc($strFilename)
{
    $strUploadDir = '/' . \Bitrix\Main\Config\Option::get('main', 'upload_dir') . '/';
    $strFile = substr($strFilename, strlen($strUploadDir));

    $connection = \Bitrix\Main\Application::getConnection();
    $sqlHelper = $connection->getSqlHelper();

    $strFile = $sqlHelper->forSql($strFile);

    $strSql = "
        SELECT ID
        FROM b_file
        WHERE CONCAT(SUBDIR, '/', FILE_NAME) = '{$strFile}'
    ";

    return $connection->query($strSql)->fetch()['ID'];
}

// Замена изображений на уменьшенные версии
function resizeImageCallback($matches)
{
    // Не обрабатываем изображения с классом not_resize
    if (str_contains($matches[1], 'not_resize'))
    {
        return $matches[1];
    }

    $imageSrc = $matches[2];
    $fileID = getFileIdBySrc($imageSrc);

    if (!$fileID)
    {
        return $matches[1];
    }

    $resizedImage = CFile::ResizeImageGet(
        $fileID,
        [
            'width' => 600,
            'height' => 400
        ],
        BX_RESIZE_IMAGE_PROPORTIONAL_ALT,
        true
    );

    if (!$resizedImage || empty($resizedImage['src']))
    {
        return $matches[1];
    }

    return str_replace(
        $imageSrc,
        $resizedImage['src'],
        $matches[1]
    );
}

Использование

Перед выводом детального описания достаточно обработать его нашей функцией.

<?
$resizedDetailText = resizeInlineImages(
    $arResult["DETAIL_TEXT"]
);

echo $resizedDetailText;
?>

После этого все изображения внутри статьи автоматически будут заменены на уменьшенные копии.

Как исключить отдельные изображения

Иногда необходимо оставить оригинальный размер изображения. Например, если это схема, чертеж или изображение уже заранее оптимизировано.

Для этого достаточно добавить изображению класс not_resize.

<img
    src="/upload/example.jpg"
    class="not_resize"
    alt="">

Такие изображения будут проигнорированы обработчиком и останутся без изменений.

Как работает код

Функция resizeInlineImages() получает HTML-код статьи и при помощи preg_replace_callback() находит все изображения внутри текста.

Для каждого найденного изображения вызывается функция resizeImageCallback(), которая получает путь к файлу, определяет его ID в базе данных и создает уменьшенную копию через CFile::ResizeImageGet().

После этого исходный путь в атрибуте src автоматически заменяется на путь к уменьшенной версии изображения. При повторных запросах Битрикс уже использует готовый файл из каталога /upload/resize_cache/, поэтому повторное изменение размеров не выполняется.

Особенности решения

  • работает только с изображениями, зарегистрированными в системе хранения файлов Битрикс;
  • не изменяет оригинальные изображения;
  • уменьшенные копии автоматически сохраняются в каталоге /upload/resize_cache/;
  • при повторной загрузке страницы используются уже готовые изображения из кэша;
  • не требует изменений в визуальном редакторе.

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

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

Комментарии

Будем рады вашему мнению и вопросам по статье.

User

Подскажите, как обжать картинки по ссылке. Например у меня есть статья, где я использую теги <img src"">. Битрикс не дает такой возможности из коробки...