imagecropauto
(PHP 5 >= 5.5.0, PHP 7, PHP 8)
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
-
threshold
とcolor
を用いてクロップします。
threshold
-
画像の色とクロップする色を比較する際に用いる許容誤差を、パーセントで指定します。 色の違いを判断する際には、RGBキューブ内での距離を用います。
IMG_CROP_THRESHOLD
モードのときにだけ利用します。注意: PHP 7.4.0 より前のバージョンでは、 PHP にバンドルされていた libgd はやや異なるアルゴリズムを用いていました。 なので、同じ
threshold
を渡しても システムの libgd と PHP にバンドルされた libgd とは異なる結果が生成されていました。 color
-
RGB値あるいはパレットインデックスを指定します。
IMG_CROP_THRESHOLD
モードのときにだけ利用します。
変更履歴
バージョン | 説明 |
---|---|
8.0.0 |
image は、
GdImage
クラスのインスタンスを期待するようになりました。
これより前のバージョンでは、有効な gd resource が期待されていました。
|
8.0.0 | 成功時には、 この関数は GDImage クラスのインスタンスを返すようになりました。 これより前のバージョンでは、 resource を返していました。 |
7.4.0 |
PHP にバンドルされた 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 に代入します
}
?>
参考
- imagecrop() - 指定した矩形に画像をクロップする
User Contributed Notes 2 notes
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);