【发布时间】:2011-12-16 23:28:21
【问题描述】:
是否有任何 PHP/GD 函数可以计算这个:
输入:图像宽度、图像高度和要遵守的纵横比。输出: 尊重给定纵横比的最大居中裁剪的宽度/高度 (尽管图像原始纵横比)。
示例:图片为 1000x500,a.r.为 1.25:最大裁剪为 625x500。图片为 100x110,最大裁剪为:80x110。
【问题讨论】:
是否有任何 PHP/GD 函数可以计算这个:
输入:图像宽度、图像高度和要遵守的纵横比。输出: 尊重给定纵横比的最大居中裁剪的宽度/高度 (尽管图像原始纵横比)。
示例:图片为 1000x500,a.r.为 1.25:最大裁剪为 625x500。图片为 100x110,最大裁剪为:80x110。
【问题讨论】:
没有计算这个的函数,因为它是初等数学:
$imageWidth = 1000;
$imageHeight = 500;
$ar = 1.25;
if ($ar < 1) { // "tall" crop
$cropWidth = min($imageHeight * $ar, $imageWidth);
$cropHeight = $cropWidth / $ar;
}
else { // "wide" or square crop
$cropHeight = min($imageWidth / $ar, $imageHeight);
$cropWidth = $cropHeight * $ar;
}
【讨论】:
作为@Jon 的answer 的扩展,这是PHP-GD library 中这种方法的实现
/**
* Crops image by taking largest area rectangle from center of image so that the desired aspect ratio is realized.
* @param resource $src_image image resource to be cropped
* @param float $required_aspect_ratio Desired aspect ratio to be achieved via cropping
* @return resource cropped image
*/
public function withCenterCrop($src_image, float $required_aspect_ratio) {
$crr_width = imagesx($src_image);
$crr_height = imagesy($src_image);
$crr_aspect_ratio = $crr_width / $crr_height;
$cropped_image = null;
if ($crr_aspect_ratio < $required_aspect_ratio) {
// current image is 'taller' (than what we need), it must be trimmed off from top & bottom
$new_width = $crr_width;
$new_height = $new_width / $required_aspect_ratio;
// calculate the value of 'y' so that central portion of image is cropped
$crop_y = (int) (($crr_height - $new_height) / 2);
$cropped_image = imagecrop(
$src_image,
['x' => 0, 'y' => $crop_y, 'width' => $new_width, 'height' => $new_height]
);
} else {
// current image is 'wider' (than what we need), it must be trimmed off from sides
$new_height = $crr_height;
$new_width = $new_height * $required_aspect_ratio;
// calculate the value of 'x' so that central portion of image is cropped
$crop_x = (int) (($crr_width - $new_width) / 2);
$cropped_image = imagecrop(
$src_image,
['x' => $crop_x, 'y' => 0, 'width' => $new_width, 'height' => $new_height]
);
}
return $cropped_image;
}
【讨论】: