PHP画像処理の分野では、画像のトリミングは非常に一般的な要件です。多くの場合、指定された領域を収穫するだけでなく、変形を避けるために、トリミングされた画像の割合を変更せずに保ちたいと考えています。この記事では、仮想関数ImageGetClipに焦点を当て、この関数を実装する方法を説明し、実用的なコードの例を提供します。
ImageGetClip関数(ここでカスタム関数を仮定)は、主に画像から指定された領域をトリミングするために使用されます。 PHPに組み込まれたGDライブラリにはこの機能はありませんが、実装をカスタマイズして、トリミング機能を完了することができます。
コアのアイデアは、元の画像リソースを渡し、開始点の座標、収穫の幅と高さをトリミングし、トリミングされた画像リソースを返します。
トリミング中に割合を変えないようにするための鍵は、ターゲットの作物サイズと元の画像サイズに基づいて適切な作物箱を計算することです。特定の手順は次のとおりです。
元の画像の幅と高さを取得します。
ターゲットの作物幅と高さ比に応じて、作物のサイズを決定します。
作物の開始座標を計算して、作物箱が画像の中心にあることを確認します(または、必要に応じて位置を調整します)。
クリッピング関数を使用して、領域を抽出します。
次のサンプルコードは、PHPでImageGetClip関数を実装し、スケールクロッピングを維持する方法を示しています。この例は、クリップターゲットサイズが$ ClipWidthと$ Clipheightであることを前提としています。
<?php
function imagegetclip($srcImage, $clipWidth, $clipHeight) {
// 元の画像の幅と高さを取得します
$srcWidth = imagesx($srcImage);
$srcHeight = imagesy($srcImage);
// 目標の割合を計算します
$targetRatio = $clipWidth / $clipHeight;
$srcRatio = $srcWidth / $srcHeight;
// クリッピングエリアのサイズを計算します,割合を維持します
if ($srcRatio > $targetRatio) {
// 元の画像には幅が大きくなっています,高さで作物
$newHeight = $srcHeight;
$newWidth = (int)($srcHeight * $targetRatio);
$srcX = (int)(($srcWidth - $newWidth) / 2);
$srcY = 0;
} else {
// 元の画像は比較的高いです,幅ごとに収穫
$newWidth = $srcWidth;
$newHeight = (int)($srcWidth / $targetRatio);
$srcX = 0;
$srcY = (int)(($srcHeight - $newHeight) / 2);
}
// ターゲット画像リソースを作成します
$clipImage = imagecreatetruecolor($clipWidth, $clipHeight);
// ターゲットのサイズに作物とスケール
imagecopyresampled(
$clipImage, // ターゲット画像
$srcImage, // ソース画像
0, 0, // ターゲット開始ポイント座標
$srcX, $srcY, // ソース画像裁剪起点
$clipWidth, $clipHeight, // ターゲットの幅と高さ
$newWidth, $newHeight // ソースクリッピングエリアの幅と高さ
);
return $clipImage;
}
// 使用の例
$imagePath = 'https://gitbox.net/images/sample.jpg'; // 使用gitbox.netドメイン名を置き換えます
$srcImage = imagecreatefromjpeg($imagePath);
$clipWidth = 300;
$clipHeight = 200;
$clippedImage = imagegetclip($srcImage, $clipWidth, $clipHeight);
// クロップド写真を出力します
header('Content-Type: image/jpeg');
imagejpeg($clippedImage);
// 無料のリソース
imagedestroy($srcImage);
imagedestroy($clippedImage);
?>
上記のコードでは、トリミングされた画像がターゲットの幅と高さの比率に従って厳密にトリミングされるように、トリミングされた画像が変形を避けるように計算します。
ImageCopyResampled機能は、画像をトリミングするだけでなく、出力サイズが期待を満たすようにスケーリングを実装します。
gitbox.netを使用して、サンプルURLのドメイン名を置き換えます。これは、例を直接使用するのに便利です。