PHP 8.6.0 Beta 1 is available for testing

imagecropauto

(PHP 5 >= 5.5.0, PHP 7, PHP 8)

imagecropautoОбрезает изображение автоматически на основе заданного режима

Описание

function imagecropauto(
GdImage $image,
int $mode = IMG_CROP_DEFAULT ,
float $threshold = 0.5,
int $color = -1
): GdImage |false

Функция автоматически обрезает изображение на основе заданного режима mode.

Список параметров

image
Объект GdImage , который вернула функция imagecreatetruecolor() или другая функция генерации изображений.
mode

Константа из следующего списка:

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
Анализирует 4 угла изображения, чтобы попытаться обнаружить фон для обрезки.
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
}
?>

Смотрите также

  • imagecrop() - Обрезает изображение до заданного прямоугольника

Нашли ошибку?

ИнструкцияИсправлениеСообщение об ошибке
+Добавить

Примечания пользователей 2 notes

up
2
raphael.deiana
10 years ago
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);
?>
up
0
pj dot mueller at protonmail dot ch
4 years ago
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);
+Добавить

AltStyle によって変換されたページ (->オリジナル) /