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
使用图像的 4 个角来尝试检测要裁剪的背景。
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 笔记

3
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);

?>
0
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