Документация для разработчиков

ResizeImageFile

CFile::ResizeImageFile(
 $sourceFile,
 &$destinationFile,
 $arSize,
 $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
 $arWaterMark = array(),
 $jpgQuality=false,
 $arFilters=false
)

Метод производит изменение размера графического файла. Если исходный файл с расширением BMP, то файл-результат будет переконвертирован как JPEG и в destinationFile вернется модифицированное имя. Статический метод.

Параметры

Параметр Описание С версии
sourceFile Путь к исходному файлу
destinationFile Путь к файлу - результату обработки. Если исходный файл в формате BMP, то файл будет переконвертирован в JPEG и в destinationFile вернется модифицированное имя.
Size Массив вида array("width" => $width, "height" => $height)); оба ключа обязательны.
resizeType тип масштабирования:
  • BX_RESIZE_IMAGE_EXACT - масштабирует в прямоугольник $arSize без сохранения пропорций;
  • BX_RESIZE_IMAGE_PROPORTIONAL - масштабирует с сохранением пропорций, размер ограничивается $arSize;
  • BX_RESIZE_IMAGE_PROPORTIONAL_ALT - масштабирует с сохранением пропорций, размер ограничивается $arSize, улучшенная обработка вертикальных картинок.
arWaterMark массив с параметрами водяного знака, ключи:
  • text - текст водяного знака
  • font - путь к TTF-шрифту (TTF/UTF-8)
  • type - text или image
  • min_size_picture - минимальная ширина картинки
  • color - цвет "RRGGBB"
  • alpha_level - прозрачность от 0 до 100, где 0 = прозрачно, 100 = непрозрачно. (Применяется только для авторского знака в виде картинки.)
  • size - размер. big; medium; small; real, для произвольного изменения масштаба возможно указание коэффициента через параметр 'coefficient', параметр 'real' применим только для изображений ('type'=>'image')
  • position - указание расположения водяного знака на изображении возможно в двух нотациях:
    • "{m|b}{c|r}", где m - центр по вертикали, b - низ, c - центр по горизонтали, r - правый край.
    • topleft; topcenter; topright; centerleft; center; centerright; bottomleft; bottomcenter; bottomright.
jpgQuality Величина JPG-сжатия. Необязательный. По умолчанию false, что равно 95% качества изображения. Если необходимо полное качество, передавайте параметр "100".9.0.0
Filters Массив параметров фильтра. Необязательный. По умолчанию false.10.0.4

Примеры использования



Пользовательские комментарии

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

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
1
Володимир Ожух
Пошаговый скрипт ресайз картинок jpeg (больше 1600) из b_file из заменой.

Код
<?php
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php'); // include  bitrix prolog (clasess)
define("STOP_STATISTICS", true); // disable statistic
CModule::IncludeModule("iblock");
global $DB;


$LastID=0; // start ID

$obRes = Bitrix\Main\FileTable::GetList(array(
    'select'  => array('ID', 'HEIGHT', 'WIDTH', 'FILE_SIZE','SUBDIR','FILE_NAME'),
    'filter'  => array('>ID'=>$LastID, 'CONTENT_TYPE'=>'image/jpeg'), //
    'order'   => array('ID'=>'asc'),
    'limit'   => 5 // файлов за шаг

));

$ptime = getmicrotime();
$io = CBXVirtualIo::GetInstance();
while ( $arRes = $obRes->fetch() )
{

    // ограничение по размеру
    if($arRes['HEIGHT']>1600 || $arRes['WIDTH']>1600){ 

//only big
        $ToResizeImg = $_SERVER["DOCUMENT_ROOT"].'/upload/'.$arRes['SUBDIR'].'/'.$arRes['FILE_NAME'];
        $tempFile = $_SERVER['DOCUMENT_ROOT']."/upload/1.jpeg";

        $rif = CFile::ResizeImageFile( // уменьшение картинки для превью
            $sourceFile = $ToResizeImg,
            $destinationFile = $tempFile,
            $arSize = array('width'=>1600,'height'=>1600),
            $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
            $arWaterMark = array(),
            $jpgQuality=false,
            $arFilters =false
        );

        if ($rif) {

            $arImageSize = CFile::GetImageSize( $tempFile);

            $f = $io->GetFile($tempFile);
            $arImageSize[2] = $f->GetFileSize();

            
            unlink($ToResizeImg);
            rename($tempFile, $ToResizeImg);
            
            //обновить поля в b_file
            $DB->Query("UPD ATE b_file SE T FILE_SIZE='".round(floatval($arImageSize[2]))."', HEIGHT='".round(floatval($arImageSize[1]))."', WIDTH='".round(floatval($arImageSize[0]))."' WHERE ID=".intval($arRes['ID']));

        }

    }
    $LastID = intval($arRes['ID']);
}

echo "Цикл выполнялся ".round(getmicrotime()-$ptime, 3)." секунд";
echo '<pre>$LastID';
print_r($LastID);
echo '</pre>';


if($LastID>0){
    ?>
    <sc ript>
        setTimeout(function(){
            window.location.reload(1);
        }, 700);

    </sc ript>
    <?
}



Цитата
*На основе скрипта, постом выше - "ватермарк на все фотки c width>1000 в папке /upload/iblock ".
0
Антон Долганин
От техподдержки

Параметр fill может быть равен resize, тогда размер ватемарка расчитывается на основании значения coefficient
Код
$wmWidth = round($Params["width"] * $Params["coefficient"]);
$wmHeight = round($Params["height"] * $Params["coefficient"]);

иначе, значение может быть repeat, тогда размер не меняется и производится заполнение всего изображения ватемарком  
0
Антон Долганин
Пример простейшего вотермарка для картинки
Код
$arWatermark = array(
   'position' => 'mc',//допустимые http://prntscr.com/c3hc9i
   'type' => 'file',
   'size' => 'real',
   'alpha_level' => 100,//прозрачность
   'file' => $_SERVER['DOCUMENT_ROOT'].Rel2Abs('/', '/upload/watermark.png'),
);
5
Dmitry Ipatov
Скрипт для  уменьшения картинок в PREVIEW_PICTURE

Код
CModule::IncludeModule("iblock");
$i = 0;

$res = CIBlockElement::GetList(
   array('ID' => 'ASC'), 
   array('IBLOCK_ID' => IBLOCK_CATALOG),
   false,
   false,
   array('ID', 'IBLOCK_ID', 'PREVIEW_PICTURE')
);
while($ar_res = $res->Fetch())
{
   $image = CFile::GetFileArray($ar_res['PREVIEW_PICTURE']);
   
   $image_src = $_SERVER['DOCUMENT_ROOT'] . $image['SRC'];
   $tmp_image = $_SERVER['DOCUMENT_ROOT'] . '/upload/' . $image['FILE_NAME'];
   
   CFile::ResizeImageFile(
       $image_src, 
       $tmp_image, 
       array('width'=>163, 'height'=>134), 
       BX_RESIZE_IMAGE_PROPORTIONAL
    );
    unlink($image_src);
    rename($tmp_image, $image_src);
    $i++;
}

echo 'Сжато изображений: ' . $i; 
1
Дмитрий Репин
Не забывайте последний массив-параметр, заключать в array();


Код
$rif = CFile::ResizeImageFile( 
$_SERVER["DOCUMENT_ROOT"]."/1.JPG",
$a = $_SERVER["DOCUMENT_ROOT"]."/4.JPG",
array('width'=>300, 'height'=>300),
BX_RESIZE_IMAGE_PROPORTIONAL,
array(),
100
,array(array("name" => "sharpen", "precision" => 15))
);
1
Азат Фаттахов
ватермарк на все фотки c width>1000 в папке /upload/iblock
Код
<?
function GetListFiles($folder,&$all_files){
    $fp=opendir($folder);
    while($cv_file=readdir($fp)) {
        if(is_file($folder."/".$cv_file)) {
            $all_files[]=$folder."/".$cv_file;
        }elseif($cv_file!="." && $cv_file!=".." && is_dir($folder."/".$cv_file)){
            GetListFiles($folder."/".$cv_file,$all_files);
        }
    }
    closedir($fp);
}
$all_files=array();
GetListFiles($_SERVER['DOCUMENT_ROOT']."/upload/iblock",$all_files);
//print_r($all_files);

foreach ($all_files as $img) {
   list($width, $height, $type, $attr) = getimagesize($img);
   if ($width>1000) {
      echo $img."<br>";
       $rif = CFile::ResizeImageFile( // уменьшение картинки для превью
       $sourceFile = $img,
       $destinationFile =  $_SERVER['DOCUMENT_ROOT']."/upload/1.png",
       $arSize = array('width'=>$width,'height'=>$height),
       $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
       $arWaterMark = array(),
       $jpgQuality=false,
       $arFilters = Array( // нанесение водяного знака
          array("name" => "watermark", "position" => "center", "file"=>$_SERVER['DOCUMENT_ROOT']."/upload/water.png")
      )
      );
      if ($rif) {
      unlink($img);
      rename($_SERVER['DOCUMENT_ROOT']."/upload/1.png", $img);}
   }
}

?>
 
4
stsvolmsk
В тексте страницы были картинки, на которые нужно было добавить водяной знак и сделать уменьшенную копию для привью prettyPhoto
Код
$wmMini = CFile::ResizeImageFile(      // уменьшение водяного знака
 $sourceFile = $_SERVER["DOCUMENT_ROOT"]."/img/watermark.png",
 $destinationFile =  $_SERVER["DOCUMENT_ROOT"]."/img/mini_watermark.png",
 $arSize = array('width'=>9999, 'height'=>100),
 $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
 $arWaterMark = array(),
 $jpgQuality=false,
 $arFilters =false
 );
$rif = CFile::ResizeImageFile( // уменьшение картинки для превью
 $sourceFile = $_SERVER["DOCUMENT_ROOT"]."/img/sect_img/canal1_1.jpg",
 $destinationFile =  $_SERVER["DOCUMENT_ROOT"]."/img/sect_img/"."wm_"."canal1_1.jpg",
 $arSize = array('width'=>300, 'height'=>300),
 $resizeType = BX_RESIZE_IMAGE_PROPORTIONAL,
 $arWaterMark = array(),
 $jpgQuality=false,
 $arFilters = Array( // нанесение водяного знака
    array("name" => "watermark", "position" => "center", "file"=>$_SERVER['DOCUMENT_ROOT']."/img/mini_watermark.png")
)
);
 
© «Битрикс», 2001-2019, «1С-Битрикс», 2019
Наверх