Задача
Наложить watermark на изображение
Решение
Функция для наложения watermark
<?php
/**
* Сжимает изображение и накладывает на него водяной знак.
* Если водяной знак не найден, просто сжимает изображение.
*
* @param $imageId - ID исходного изображения для наложения водяного знака
* @param $watermarkPath - Путь до изображения водяного знака
* @param int $width - Целевая ширина конечного изображения
* @param int $height - Целевая высота конечного изображения
* @param string $wmPosition - topleft, topcenter, topright, centerleft, center, centerright, bottomleft, bottomcenter, bottomright
* @param float $wmScale - значение от 0 до 1. Масштаб водяного знака относительно ширины изображения
* @param int $wmMaxWidth - Максимальная ширина водяного знака в пикселях. Если не установлено, то не учитывается.
* Необходимо для ограничения ширины водяного знака на больших изображениях
* @param int $resizeType - Тип масштабирования изображения
* <p>BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize c сохранением пропорций, обрезая лишнее; </p>
* <p>X_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize; </p>
* <p>BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций за ширину при этом принимается максимальное значение из высоты/ширины, размер ограничивается $arSize, улучшенная
* обработка вертикальных картинок.</p>
* @return mixed - Сжатое изображение с водяным знаком
*/
function getImageWithWatermark($imageId, $watermarkPath, $width = 320, $height = 320, $wmPosition = 'center', $wmScale = 0.5, $wmMaxWidth,
$resizeType = BX_RESIZE_IMAGE_PROPORTIONAL)
{
$arFilters = [];
$arDestinationSize = ['width' => $width, 'height' => $height];
if (is_readable($watermarkPath) || is_readable($watermarkPath = $_SERVER['DOCUMENT_ROOT'] . '/' . $watermarkPath)) {
$bNeedCreatePicture = false;
$arSourceSize = [];
$originalImageSizes = CFile::GetImageSize($_SERVER["DOCUMENT_ROOT"] . CFile::GetPath($imageId));
CFile::ScaleImage($originalImageSizes["0"], $originalImageSizes["1"], ["width" => $width, "height" => $height], $resizeType, $bNeedCreatePicture, $arSourceSize, $arDestinationSize);
$newWmWidth = $arDestinationSize['width'] * $wmScale;
if ($wmMaxWidth && $newWmWidth > $wmMaxWidth) {
$newWmWidth = $wmMaxWidth;
}
$watermarkResized = $_SERVER['DOCUMENT_ROOT'] . "/upload/watermark/" . SITE_TEMPLATE_ID . $newWmWidth . ".png";
if (!is_readable($watermarkResized)) {
CFile::ResizeImageFile($watermarkPath, $watermarkResized, ["width" => $newWmWidth, 'height' => $arDestinationSize['height']],
BX_RESIZE_IMAGE_PROPORTIONAL, false, 95, []);
}
if (is_readable($watermarkResized)) {
$arFilters[] = [
"name" => "watermark",
"size" => "real",
"position" => $wmPosition,
"file" => $watermarkResized
];
}
}
return CFile::ResizeImageGet($imageId, $arDestinationSize, $resizeType, true, $arFilters, false, 100);
}