Last active
March 3, 2020 13:57
-
-
Save Elvinz/748bf5137b1cdba1da317213a8eaa5c8 to your computer and use it in GitHub Desktop.
ResizeImageGet и простой водяной знак налету
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Итак, за основу я взял метод 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); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Скриншот 1

Скриншот 2
