Предположим, вы хотите изменить размер CSS-типа "обложки", у вас есть две опции:
- Изображение по вертикали
- Изображение по горизонтали
сначала определите соотношение источника и назначения:
$dest_ratio = $dest_imagex / $dest_imagey;
$source_ratio = $source_imagex / $source_imagey;
Если соотношение источников больше, чем коэффициент описания, это означает, что вам нужна шкала горизонтальной подгонки, в противном случае вам нужна шкала вертикальной подгонки.
Шкала горизонтальной посадки
![enter image description here](https://i.stack.imgur.com/nm79K.png)
imagecopyresampled(
$dest_image,
$source_image,
0,
0,
0,
($source_imagey - ($source_imagex * $dest_ratio)) / 2,
$dest_imagex,
$dest_imagex * $source_ratio,
$source_imagex,
$source_imagey
);
Шкала вертикальной посадки
![Vertical Fit Scale](https://i.stack.imgur.com/ZWHon.png)
imagecopyresampled(
$dest_image,
$source_image,
0,
0,
($source_imagex - ($source_imagey / $dest_ratio)) / 2,
0,
$dest_imagey / $source_ratio,
$dest_imagey,
$source_imagex,
$source_imagey
);
Все вместе:
function crop($source, $dest, $dest_imagex, $dest_imagey, $quality)
{
$source_image = imagecreatefromjpeg($source);
// Get dimensions of the original image
$source_imagex = imagesx($source_image);
$source_imagey = imagesy($source_image);
$source_ratio = $source_imagey / $source_imagex;
$dest_ratio = $dest_imagey / $dest_imagex;
$dest_image = imagecreatetruecolor($dest_imagex, $dest_imagey);
imagefill($dest_image, 0, 0, imagecolorallocate($dest_image, 255, 0, 0));
if ($dest_ratio >= $source_ratio) {
imagecopyresampled(
$dest_image,
$source_image,
0,
0,
($source_imagex - ($source_imagey / $dest_ratio)) / 2,
0,
$dest_imagey / $source_ratio,
$dest_imagey,
$source_imagex,
$source_imagey
);
} else {
imagecopyresampled(
$dest_image,
$source_image,
0,
0,
0,
($source_imagey - ($source_imagex * $dest_ratio)) / 2,
$dest_imagex,
$dest_imagex * $source_ratio,
$source_imagex,
$source_imagey
);
}
imagejpeg($dest_image, $dest, $quality);
}
Использование
crop("image1.jpg", "image1_resized.jpg", 100, 100, 100);