(PHP 5 >= 5.5.0, PHP 7, PHP 8)
imagecropauto — Обрезает изображение автоматически на основе заданного режима
$image,$mode = IMG_CROP_DEFAULT ,$threshold = 0.5,$color = -1
Функция автоматически обрезает изображение на основе заданного
режима mode.
imagemodeКонстанта из следующего списка:
IMG_CROP_DEFAULT IMG_CROP_TRANSPARENT .
До PHP 7.4.0 встроенный модуль libgd выбирал режим IMG_CROP_SIDES ,
если у изображения не было прозрачного цвета.
IMG_CROP_TRANSPARENT IMG_CROP_BLACK IMG_CROP_WHITE IMG_CROP_SIDES IMG_CROP_THRESHOLD threshold
и цвету color.
thresholdПараметр определяет допуск в процентах, который функция не превысит при сравнении цвета изображения и цвета обрезки. Метод расчёта цветовой разницы основан на цветовом расстоянии в кубе RGB(a).
Учитывается только в режиме IMG_CROP_THRESHOLD .
Замечание: До PHP 7.4.0 встроенная библиотека libgd работала по другому алгоритму, поэтому один и тот же порог
thresholdвыдавал разные результаты для системной и встроенной библиотеки libgd.
colorЗначение RGB-цвета или индекс палитры.
Учитывается только в режиме IMG_CROP_THRESHOLD .
Функция возвращает объект обрезанного изображения, если выполнилась успешно, или false , если возникла ошибка.
Функция возвращает false и при обрезке всего изображения.
| Версия | Описание |
|---|---|
| 8.0.0 |
Параметр image теперь принимает объект GdImage ;
раньше параметр принимал корректный gd-ресурс (resource ).
|
| 8.0.0 | Функция теперь возвращает объект класса GDImage , если выполнилась успешно; раньше возвращался ресурс (resource ). |
| 7.4.0 |
Поведение функции imagecropauto() во встроенной библиотеке libgd синхронизировали
с поведением системной библиотеки libgd: режим IMG_CROP_DEFAULT больше
не откатывается к режиму IMG_CROP_SIDES , а пороговая обрезка теперь
работает по тому же алгоритму, что и системная библиотека libgd.
|
| 7.4.0 |
Значение режима mode по умолчанию изменили
на IMG_CROP_AUTO. Раньше значением по умолчанию было
-1, что соответствует режиму IMG_CROP_DEFAULT ,
но передача значения -1 теперь устарела.
|
Пример #1 Правильная обработка автообрезки
Как отмечает раздел возвращаемого значения, функция imagecropauto()
возвращает false , если обрезала всё изображение.
В этом примере ресурс изображения $im автоматически обрезается,
только если есть, что обрезать; иначе продолжается работа с исходным изображением.
<?php
$cropped = imagecropauto($im, IMG_CROP_DEFAULT);
if ($cropped !== false) { // При возврате нового объекта изображения
$im = $cropped; // Назначаем обрезанное изображение переменной $im
}
?>In some cases the use of the IMG_CROP_WHITE or IMG_CROP_BLACK does not work. The function returns FALSE. It is best to use the IMG_CROP_THRESHOLD mode and specify the color in fourth argument as in the example below :
<?php
$original_img = imagecreatefromjpeg($image_path);
// Use this :
$cropped_img_white = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 16777215);
// Rather than :
$cropped_img_white = imagecropauto($original_img , IMG_CROP_WHITE);
// AND
// Use this :
$cropped_img_black = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 0);
// Rather than :
$cropped_img_black = imagecropauto($original_img , IMG_CROP_BLACK);
?>I don’t know why you can’t set the threshold for the four sides filter (IMG_CROP_SIDES) so here’s how to do it manually using the IMG_CROP_THRESHOLD filter instead.
$threshold = .5;
$im = imagecreatefromjpeg('somefile.jpg');
$width = imagesx($im);
$height = imagesy($im);
$arr = [
[0,0],
[$width-1,0],
[0,$height-1],
[$width-1,$height-1],
];
$red = 0;
$green = 0;
$blue = 0;
// grab the colours from all four corners
foreach( $arr as $arr2 ) {
$thisColor = imagecolorat($im, $arr2[0], $arr2[1]);
$rgb = imagecolorsforindex($im, $thisColor);
$red += round(round(($rgb['red'] / 0x33)) * 0x33);
$green += round(round(($rgb['green'] / 0x33)) * 0x33);
$blue += round(round(($rgb['blue'] / 0x33)) * 0x33);
}
// and average them
$red /= 4;
$green /= 4;
$blue /= 4;
$newColor = imagecolorallocate($im, $red, $green, $blue);
$cropped = imagecropauto($im, IMG_CROP_THRESHOLD, $threshold, $newColor);
imagejpg($cropped, 'somefile.cropped.jpg');
imagedestroy($im);
imagedestroy($cropped);