画像のサイズを変更するために、幅と高さを固定値で定義しています。しかし、画像のサイズ比は任意に設定できるため、問題があります(垂直または水平この場合、幅と高さが固定されていると問題が生じます。計算したいのですが幅と高さよりスマートな方法で。
例えば、次のように定義したとします。幅1024ピクセル、高さ768ピクセル縦長の画像のサイズを変更したいのですが(高さ1100ピクセル、幅200ピクセル)私の場合はサイズが固定されますサイズ (1024x768)幅は100ピクセルから768ピクセル、非常に醜いものになります。同様に、画像の高さが768ピクセル、それは強制的に高さを増加させる768ピクセル。
したがって、元の画像のサイズ比に基づいて新しい画像のサイズを計算したいと思います。上記の例の画像を最大の高さにサイズ変更すると、768ピクセルでは、幅はどうでしょうか?すでに「最大幅」よりも小さくなっています。200ピクセル幅はそのままにしておくべきでしょうか、それともさらに狭くするべきでしょうか?
同様に、画像に高さ200ピクセル、幅1100ピクセル幅は1024ピクセルに減少、高さはどうですか?
3つ目の問題は、高さと幅の両方が最大高さと最大幅より大きいと仮定すると、幅: 1100ピクセル、高さ: 4000ピクセル幅と高さは両方とも最大幅と最大高さより大きいのですが、画像は垂直なので、水平になります。この場合、画像のサイズを最大高さに合わせて変更するか、最大幅に合わせて変更するかをどのように確認すればよいでしょうか?
これに関して何か助けていただければ幸いです。
ベストアンサー1
以下は、私が個人的に集めた画像サイズ変更コードのコードです。まず、必要なデータは次のとおりです。
list($originalWidth, $originalHeight) = getimagesize($imageFile);
$ratio = $originalWidth / $originalHeight;
次に、このアルゴリズムは、元のアスペクト比を維持しながら、画像を元のサイズより大きく拡大せずに、画像をできる限りターゲット サイズに合わせます。
$targetWidth = $targetHeight = min($size, max($originalWidth, $originalHeight));
if ($ratio < 1) {
$targetWidth = $targetHeight * $ratio;
} else {
$targetHeight = $targetWidth / $ratio;
}
$srcWidth = $originalWidth;
$srcHeight = $originalHeight;
$srcX = $srcY = 0;
これにより、画像が引き伸ばされるのではなく、ターゲット サイズに完全に収まるように切り取られます。
$targetWidth = $targetHeight = min($originalWidth, $originalHeight, $size);
if ($ratio < 1) {
$srcX = 0;
$srcY = ($originalHeight / 2) - ($originalWidth / 2);
$srcWidth = $srcHeight = $originalWidth;
} else {
$srcY = 0;
$srcX = ($originalWidth / 2) - ($originalHeight / 2);
$srcWidth = $srcHeight = $originalHeight;
}
実際のサイズ変更は次のようになります。
$targetImage = imagecreatetruecolor($targetWidth, $targetHeight);
imagecopyresampled($targetImage, $originalImage, 0, 0, $srcX, $srcY, $targetWidth, $targetHeight, $srcWidth, $srcHeight);
この場合、$size
幅と高さの両方に 1 つの数値 (正方形のターゲット サイズ) があります。正方形以外のターゲットを使用するように変更できるはずです。また、使用できる他のサイズ変更アルゴリズムについてのインスピレーションも得られるはずです。