PHP Conference Japan 2024

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
imagecropauto(): GdImage|false

根據指定的 mode 自動裁切圖片。

參數

image

一個 GdImage 物件,由其中一個圖片建立函式返回,例如 imagecreatetruecolor()

mode

以下常數之一

IMG_CROP_DEFAULT
IMG_CROP_TRANSPARENT 相同。在 PHP 7.4.0 之前,如果圖片沒有透明顏色,則綁定的 libgd 會 fallback 到 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 資源
8.0.0 成功時,此函式現在返回一個 GDImage 實例;以前返回一個 資源
7.4.0 綁定的 libgd 中 imagecropauto() 的行為已與系統 libgd 同步:IMG_CROP_DEFAULT 不再 fallback 到 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