Skip to content

Instantly share code, notes, and snippets.

@Elvinz
Last active March 3, 2020 13:57
Show Gist options
  • Save Elvinz/748bf5137b1cdba1da317213a8eaa5c8 to your computer and use it in GitHub Desktop.
Save Elvinz/748bf5137b1cdba1da317213a8eaa5c8 to your computer and use it in GitHub Desktop.
ResizeImageGet и простой водяной знак налету
Итак, за основу я взял метод ResizeImageGet. Почему? Потому что именно он делает копию картинки, а не воздействует на оригинал. И именно он внутри себя обращается к методу CFile::ResizeImageFile, который уже может наложить водяной знак.
Для начала создаем класс с одним статическим методом:
class CFileWater extends CAllFile
{
public static $watermark = array(
'position' => 'mc',//допустимые http://prntscr.com/c3hc9i
'type' => 'file',
'size' => 'real',
'alpha_level' => 100,//прозрачность
'file' => '/upload/watermark.png',
);
}
Параметр fill может быть равен resize, тогда размер ватемарка расчитывается на основании значения coefficient
$wmWidth = round($Params["width"] * $Params["coefficient"]);
$wmHeight = round($Params["height"] * $Params["coefficient"]);
иначе, значение может быть repeat, тогда размер не меняется и производится заполнение всего изображения ватемарком
Собственно, это и будет ваш класс для применения вотермарка. В нем указаны настройки, которыми можно крутить для знака.
Затем идем в /bitrix/modules/main/classes/general/file.php и находим там метод ResizeImageGet. Копируем его как есть и вставляем в ваш метод. Я намеренно не прикладываю здесь готовых файлов, потому что данный метод может довольно часто меняться, и через пару версий уже быть совершенно иным.
Вставили метод, теперь работаем с ВАШИМ классом, в ядре ничего не меняем. Сразу скажу, что вы можете менять его как угодно, какие угодно параметры добавлять, но я шел по пути минимального вмешательства.
Первое, находим блок проверки размерности картинки и либо удаляем его, либо комментим. Это сделать надо для того, чтобы вы могли натравливать метод ресайза без изменения фактических размеров картинки (но вместе с тем сделав копию картинки, чтобы не повредить оригинал).
Скриншот 1
Затем находим еще блок кода непосредственно перед ресайзом копии.
Скриншот 2
И туда сверху вставляем данные пару строк:
$arWatermark = self::$watermark;
$arWatermark['file'] = $_SERVER['DOCUMENT_ROOT'].$arWatermark['file'];
А где вторым прямоугольником отмечено, мы заменяем array() на ваш новый массив. Это и есть применение вотермарка и собственно все танцы с бубном ради него. И вот теперь об автоматике. Если вы взглянете в коде еще выше, то увидите там обработку события OnBeforeResizeImage. И вот его можно научить принимать переменные по ссылке, и дополнить его передачей параметра вотермарка. Тогда все это можно было бы менять в обработчике. Очень маленькая мелочь, и я надеюсь ее Битрикс сделает рано или поздно.
По сути все, теперь как применять. Ну во-первых, если у вас уже используется ResizeImageGet, вы можете просто заменить в коде вызов CFile::ResizeImageGet на CFileWater::ResizeImageGet и все будет работать.
Теперь о том, почему я настройки знака вынес в отдельную переменную. А чтобы для разных вариантов подбрасывать разные водяные знаки.
Например:
CFileWater::$watermark['position'] = 'br';
CFileWater::$watermark['file'] = CFileWater::$watermark['file_small'];
$arOfferPicture = CFileWater::ResizeImageGet($iOfferPicture,
array('width' => 250, 'height' => 250),
BX_RESIZE_IMAGE_PROPORTIONAL_ALT);
@Elvinz
Copy link
Author

Elvinz commented Mar 3, 2020

Скриншот 1
Screenshot_5.png

Скриншот 2
Screenshot_5.png

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment