(PHP 5 >= 5.5.0, PHP 7, PHP 8)
imagecropauto — Recorta una imagen automáticamente utilizando uno de los modos disponibles
$image,$mode = IMG_CROP_DEFAULT ,$threshold = 0.5,$color = -1
Recorta automáticamente una imagen según el mode.
imagemodeUna constante entre:
IMG_CROP_DEFAULT IMG_CROP_TRANSPARENT .
Anterior a PHP 7.4.0, la biblioteca libgd integrada utilizaba
IMG_CROP_SIDES como solución de respaldo,
si la imagen no tenía color de transparencia.
IMG_CROP_TRANSPARENT IMG_CROP_BLACK IMG_CROP_WHITE IMG_CROP_SIDES IMG_CROP_THRESHOLD threshold y
color.
thresholdEspecifica la tolerancia en porcentaje a utilizar durante la comparación de la color de la imagen y la color a recortar. El método utilizado para calcular la diferencia de color se basa en la distancia de colores en el cubo RVB(a).
Utilizado únicamente en modo IMG_CROP_THRESHOLD .
Nota: Anterior a PHP 7.4.0, la biblioteca libgd integrada utilizaba un algoritmo algo diferente, por lo que el mismo
thresholdproducía resultados diferentes para libgd sistema e integrado.
colorPuede ser un valor de color RVB o un índice de paleta.
Utilizado únicamente en modo IMG_CROP_THRESHOLD .
Devuelve el objeto de la imagen recortada en caso de éxito o false si ocurre un error.
false también será devuelto si toda la imagen ha sido recortada.
| Versión | Descripción |
|---|---|
| 8.0.0 |
image ahora espera una instancia de GdImage
; anteriormente, se esperaba un recurso gd de tipo resource válido.
|
| 8.0.0 | En caso de éxito, esta función devuelve ahora una instancia de GDImage ; anteriormente, se devolvía un resource . |
| 7.4.0 |
El comportamiento de imagecropauto de la biblioteca libgd integrada ha sido
sincronizado con la de libgd sistema: IMG_CROP_DEFAULT
ya no utiliza IMG_CROP_SIDES como solución de respaldo y
la tolerancia de recorte utiliza ahora el mismo algoritmo que libgd sistema.
|
| 7.4.0 |
El valor por omisión de mode ha sido modificado a
IMG_CROP_AUTO. Anteriormente, el valor por omisión era
-1 que corresponde a IMG_CROP_DEFAULT ,
pero pasar -1 está ahora obsoleto.
|
Ejemplo #1 Recorte automático correcto
Como se indica en la sección valor de retorno, imagecropauto()
devuelve false si toda la imagen ha sido recortada. En este ejemplo, tenemos
un objeto de imagen $im que solo debería ser
automáticamente recortado si hay algo que recortar; de lo contrario,
se desea conservar la imagen original.
<?php
$cropped = imagecropauto($im, IMG_CROP_DEFAULT);
if ($cropped !== false) { // Si se ha devuelto un nuevo objeto de imagen
$im = $cropped; // y asigna la imagen recortada a $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);