Нужна некоторая работа, но она должна дать вам достаточно для начала.
function crop($filename, $width, $height)
{
// image resource, assuming it's PNG
$resource = imagecreatefrompng($filename);
// resource dimensions
$size = array(
0 => imagesx($resource),
1 => imagesy($resource),
);
// sides
$longer = (int)($size[0]/$width > $size[1]/$height);
$shorter = (int)(!$longer);
// ugly hack to avoid condition for imagecopyresampled()
$src = array(
$longer => 0,
$shorter => ($size[$shorter]-$size[$longer])/2,
);
// new image resource
$new = imagecreatetruecolor($width, $height);
// do the magic
imagecopyresampled($new, $resource,
0, 0,
$src[0], $src[1],
$width, $height,
$size[$longer], $size[$longer]
);
// save it or something else :)
}
Редактировать: Попытка объяснить "уродливый взлом" выше.
ДваРассматриваемые параметры $src_x
и $src_y
, взятые из manual :
imagecopyresampled () получат прямоугольную область из src_image ширины src_w и высоты src_h в позиции (src_x, src_y) и поместите его в прямоугольную область dst_image шириной dst_w и высотой dst_h в позиции (dst_x, dst_y).
Значение, если ширина $filename
больше, src_x
должно быть 0
, а если высота больше, src_y
должно быть 0
.В переводе на код это будет выглядеть примерно так:
$src = ($size[$shorter]-$size[$longer])/2;
if ( $longer === 1 )
{
imagecopyresampled($new, $resource,
0, 0,
$src, 0,
$width, $height,
$size[$longer], $size[$longer]
);
}
else
{
imagecopyresampled($new, $resource,
0, 0,
0, $src,
$width, $height,
$size[$longer], $size[$longer]
);
}