Уже сто раз про это писали. В гугле я все это нашел, но осталось несколько вопросов. Свою ситуацию не встретил.
К делу... Есть инфоблок. В нем есть несколько полей с файлами. Поля множественного типа. Добавляем в них картинки и нужно на эти картинки ставить водяной знак.
Почему элементов несколько? Это блок, в котором будут храниться обои для рабочего стола. И нужно хранить разные разрешения для одной картинки. Прошу тут не обсуждать вопрос архитектуры решения, вопрос не о ней. Сейчас она такая: есть несколько свойств. Каждое свойство это разрешение экрана пользователя. Сделано так для фильтрации по разрешениям.
function AddWatermarkToWallpaper(&$arFields){
$wallpaperArray = Array(12); //Список блоков с обоями. А вдруг их будет больше?
if (in_array($arFields['IBLOCK_ID'], $wallpaperArray)){
$tmp = Array();
foreach($arFields['PROPERTY_VALUES'] as $key => $value) //получаем список свойств (разные разрешения)
foreach($value as $key2 => $value2) //получаем список их значений
if($value2["tmp_name"]) $tmp[] = $value2["tmp_name"];
if($tmp[0]){
//Что дальше?
}
}
}
На этом шаге у меня есть массив, в который записаны все картинки, которые добавили или изменили. Что-то типа tmp/f4F514FX. Внимание, вопрос: как применить функцию CFile::ResizeImageGet зная только путь временной картинки и как потом заменить ее на картинку с водяным знаком?
Конечно, я пробовал подставить (значения только для теста):
Но это, очевидно, не работает (да и не должно, судя по документации). Мне кажется верным шагом смотреть в сторону CFile::SaveFile, но не совсем ясна работа функции. Не будет ли у меня дублирование файлов, куда переносится файл? Пожалуйста, помогите разобраться и найти верное решение задачи.
scifi пишет: Внимание, вопрос: как применить функцию CFile::ResizeImageGet зная только путь временной картинки и как потом заменить ее на картинку с водяным знаком?
Это решение не работает, функция ничего не возвращает и размер картинки не меняется. Кстати, использовать функцию MakeFileArray в таком случае нет смысла, т.к. я уже получаю такую массив при чтении свойств:
Код
$tmp = Array();
foreach($arFields['PROPERTY_VALUES'] as $key => $value)
foreach($value as $key2 => $value2)
if($value2["tmp_name"]) $tmp[] = $value2; //вот тут теперь будет та же структура, что и после MakeFileArray
if($tmp[0]){ //это просто для отладки тут так сделано
$v = CFile::ResizeImageGet($tmp[0], array('width'=>150, 'height'=>150), BX_RESIZE_IMAGE_PROPORTIONAL, true);
//$v = CFile::ResizeImageGet(CFile::MakeFileArray($tmp[0]), array('width'=>150, 'height'=>150), BX_RESIZE_IMAGE_PROPORTIONAL, true);
file_put_contents($_SERVER['DOCUMENT_ROOT']."/log.txt", print_r($v, true));
}
Не работают и первый вариант, и закомментированный.
Зачем я меняю размер картинки на 1 px? Все очень просто: функция не добавит водяной знак, если вы не поменяете размер. Просто супер. Пожалуй, эта функция пока занимает первое место в рейтинге тупак года от битрикс.
Это условие выполняется при условии, что загружена картинка. У меня было свойство типа файл. Множественное. Возможно, вам стоит уменьшить глубина цикла и достаточно одного foreach. Если тип не множественное.