2024年PHP日本大会

imagecropauto

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

imagecropauto使用一种可用的模式自动裁剪图像

描述

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
使用图像的四个角尝试检测要裁剪的背景。
IMG_CROP_THRESHOLD
使用给定的thresholdcolor裁剪图像。
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 捆绑的libgd中imagecropauto()的行为已与系统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) { // 如果返回了新的图像对象
imagedestroy($im); // 我们销毁原始图像
$im = $cropped; // 并将裁剪后的图像赋值给 $im
}
?>

参见

添加注释

用户贡献的注释 2 条注释

raphael.deiana
8 年前
在某些情况下,使用IMG_CROP_WHITE或IMG_CROP_BLACK不起作用。该函数返回FALSE。最好使用IMG_CROP_THRESHOLD模式,并在下面的示例中指定第四个参数中的颜色

<?php

$original_img
= imagecreatefromjpeg($image_path);

// 使用这个:
$cropped_img_white = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 16777215);
// 而不是:
$cropped_img_white = imagecropauto($original_img , IMG_CROP_WHITE);

// 和

// 使用这个:
$cropped_img_black = imagecropauto($original_img , IMG_CROP_THRESHOLD, null, 0);
// 而不是:
$cropped_img_black = imagecropauto($original_img , IMG_CROP_BLACK);

?>
pj dot mueller at protonmail dot ch
2 年前
我不知道为什么你不能为四边滤镜 (IMG_CROP_SIDES) 设置阈值,所以这里是如何使用 IMG_CROP_THRESHOLD 滤镜手动执行此操作。

$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;

// 获取所有四个角的颜色
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);
}

// 并取平均值
$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);
To Top