PHPのお勉強!

PHP TOP

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

imagecreatetruecolor()のような画像作成関数が返す GdImage オブジェクト。

mode

以下の定数のいずれか。

IMG_CROP_DEFAULT
IMG_CROP_TRANSPARENT と同じです。 PHP 7.4.0 より前のバージョンでは、 PHP にバンドルされた libgd は、 画像に透過色がない場合に IMG_CROP_SIDES にフォールバックしていました。
IMG_CROP_TRANSPARENT
透過色の背景をクロップします。
IMG_CROP_BLACK
黒の背景をクロップします。
IMG_CROP_WHITE
白の背景をクロップします。
IMG_CROP_SIDES
画像の四隅から、クロップする背景色を検出します。
IMG_CROP_THRESHOLD
thresholdcolor を用いてクロップします。
threshold

画像の色とクロップする色を比較する際に用いる許容誤差を、パーセントで指定します。 色の違いを判断する際には、RGBキューブ内での距離を用います。

IMG_CROP_THRESHOLD モードのときにだけ利用します。

注意: PHP 7.4.0 より前のバージョンでは、 PHP にバンドルされていた libgd はやや異なるアルゴリズムを用いていました。 なので、同じ threshold を渡しても システムの libgd と PHP にバンドルされた libgd とは異なる結果が生成されていました。

color

RGB値あるいはパレットインデックスを指定します。

IMG_CROP_THRESHOLD モードのときにだけ利用します。

戻り値

成功した場合にクロップ後の画像オブジェクトを返します。 失敗した場合に false を返します 画像全体がクロップされてしまった場合にも false を返します。

変更履歴

バージョン 説明
8.0.0 image は、 GdImage クラスのインスタンスを期待するようになりました。 これより前のバージョンでは、有効な gd resource が期待されていました。
8.0.0 成功時には、 この関数は GDImage クラスのインスタンスを返すようになりました。 これより前のバージョンでは、 resource を返していました。
7.4.0 PHP にバンドルされた imagecropauto() の振る舞いは、 システムにインストールされる libgd のそれと同じになりました。 つまり、IMG_CROP_DEFAULTIMG_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 に代入します
}
?>

参考

  • imagecrop() - 指定した矩形に画像をクロップする
add a note

User Contributed Notes 2 notes

up
3
raphael.deiana
8 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
2 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);