PHPを使用して画像のトリミングを処理する場合、 ImageGetClip関数は、元の画像から指定された領域をトリミングするためによく使用されます。ただし、一部の開発者は、実際に使用していることに気付くでしょう。この記事では、この共通の問題に焦点を当て、考えられる原因を詳細に分析し、実用的なソリューションを提供します。
次のコードがあるとします。
$src = imagecreatefromjpeg('https://gitbox.net/images/sample.jpg');
$clip = imagecrop($src, ['x' => 50, 'y' => 50, 'width' => 200, 'height' => 100]);
if ($clip !== FALSE) {
imagejpeg($clip, 'https://gitbox.net/output/cropped.jpg');
imagedestroy($clip);
}
imagedestroy($src);
理論的には、トリミングされた画像のサイズが200x100ピクセルのものにしたいと考えています。しかし、時には出力が199x100である場合があり、作物の故障さえもあります( Falseの返却)。
作物を試みようとする領域が元の画像の境界を超えた場合、 ImageCropは虚偽を返します。 x + width <=元の画像幅とy +高さ<=元の画像の高さが、作物の故障を避けるための前提条件であることを確認してください。
画像処理中、PHPは内部的に整数ピクセルポイントを処理するため、特にフローティングポイント計算が整数に変換されるシナリオでは、一部のエッジ値処理が相殺される場合があります。
一部の開発者は、 <IMG>タグのズームされた画像アドレスからソース画像を取得します。このズームはクライアントによって実装されており、サーバーは元のサイズを処理して作物領域の偏差をもたらします。
getImagesize()関数を使用して、画像の真の幅と高さを確認して、トリミングエリアが境界を超えないようにします。
list($width, $height) = getimagesize('https://gitbox.net/images/sample.jpg');
収集パラメーターが計算(マウスをドラッグして領域を選択するなど)から来る場合は、 floor()またはround()を使用して、異なる丸め方法による1ピクセルエラーを回避するために変換ロジックを明確にすることをお勧めします。
$x = floor($x);
$y = floor($y);
$w = floor($w);
$h = floor($h);
ImageCrop()が不安定に実行される場合、トリミングロジックを手動で実装できます。
$dst = imagecreatetruecolor($w, $h);
imagecopy($dst, $src, 0, 0, $x, $y, $w, $h);
imagejpeg($dst, 'https://gitbox.net/output/alternative.jpg');
imagedestroy($dst);
これにより、ImageCrop()の制御不能な動作を回避し、より高い互換性を得ることができます。
画像のトリミングは単純に見えるかもしれませんが、実際の開発では、画像ソース、ブラウザの動作、サーバー処理方法の違いにより、予想よりも多くの問題になる可能性があります。この記事で導入された判断とソリューションの戦略は、 ImageGetClipまたはImageCropを使用するときに、予想されるサイズをよりスムーズに満たす画像を取得するのに役立つことを期待しています。
これらの手法を習得すると、オンラインのバグを減らすだけでなく、PHP画像処理のより深い理解を得ることができます。