php: создать миниатюру нестандартного размера
Я знаком с изменением размера и обрезкой изображений в php с использованием imagecopyresampled, но теперь у меня возникла особая проблема: задача состоит в обрезке большого изображения, например. От 1600x1200 до 500x120, что означает изменение размера до 500px и уменьшение его высоты до 120px. Есть ли какой-то простой способ или мне нужно рассчитать значения обрезки все самостоятельно? Спасибо
2 ответа
Есть PHP библиотека, которая может помочь вам, называется PHPThumb. Вы можете найти здесь https://github.com/masterexploder/PHPThumb
У них есть адаптивный метод изменения размера, который делает то, что вы ищете. https://github.com/masterexploder/PHPThumb/wiki/Basic-Usage
Вы должны сделать это самостоятельно.
Я не знаю, хотите ли вы обрезать или нет, поэтому вот как рассчитать значения для обоих:
Масштабировать изображение: изменить размер в соответствии с новым, сохраняя соотношение сторон (поэтому 1 сторона может быть короче указанной)
function calc_scale_dims($width_orig, $height_orig, $max_width, $max_height) {
$new_width=$width_orig;
$new_height=$height_orig;
$ratioh = $max_height/$new_height;
$ratiow = $max_width/$new_width;
$ratio = min($ratioh, $ratiow);
// New dimensions
$dims["w"] = intval($ratio*$new_width);
$dims["h"] = intval($ratio*$new_height);
return $dims;
}
Изменить размер и обрезать: изменяет размеры изображения и обрезает его так, чтобы оно соответствовало заданному размеру, если новое соотношение сторон отличается (например, если соотношения сторон отличаются, изображение будет изменено в соответствии с указанным размером для короткого размера и более длинным, если оно будет обрезано посередине)
function calc_crop_resize_dims($width_orig, $height_orig, $new_width, $new_height) {
//Calculate scaling
$ratio_orig = $width_orig/$height_orig;
$ratio_new = $new_width/$new_height;
if ($ratio_new < $ratio_orig) {
$copy_width = $height_orig*$ratio_new;
$copy_height = $height_orig;
} else {
$copy_width = $width_orig;
$copy_height = $width_orig/$ratio_new;
}
//point to start copying from (to copy centre of image if we are cropping)
$dims["src_x"] = ($width_orig - $copy_width)/2;
$dims["src_y"] = ($height_orig - $copy_height)/2;
$dims["copy_width"] = $copy_width;
$dims["copy_height"] = $copy_height;
return $dims;
}