Bueno, yo tambien necesitaba recortar imagenes, principalmente porque cuando requieres de vista previa (thumbnail) casi siempre es con dimensiones fijas, asi que... a ver si sirve de algo el aporte:
Código PHP:
Ver originalpublic function resizeToFit($width, $height, $margins = false) {
// Calculamos ambos ratios
$ratioW = $width / $this->getWidth();
$ratioH = $height / $this->getHeight();
// Obtenemos el mayor si es con recorte
// O el menor para agregar márgenes blancos donde se requiera
$ratio = ($margins === false) ?
max($ratioW, $ratioH) : min($ratioW, $ratioH); $newW = floor($this->getWidth() * $ratio); $newH = floor($this->getHeight() * $ratio);
// Redimensionamos, conservando relación de aspecto
$this->resize($newW, $newH);
// Si es necesario recortar y/o agregar márgenes en el lado más corto
if($newW != $width || $newH != $height) {
// Creamos el nuevo lienzo con las medidas que necesitamos
// Si la imagen es mayor, el origen lo tomamos centrado
$ox = ($newW > $width) ?
floor(($newW - $width) / 2) : 0; $oy = ($newH > $height) ?
floor(($newH - $width) / 2) : 0; // Si la imagen es menor, dejamos márgenes en el lado más corto
$dx = ($newW < $width) ?
floor(($width - $newW) / 2) : 0; $dy = ($newH < $height) ?
floor(($height - $newH) / 2) : 0;
imagecopy($newImage, $this->_image
, $dx, $dy, $ox, $oy, $width, $height); $this->_image = $newImage;
}
}
Las medidas son fijas, asi que:
$margins === false => Se redimensiona la imagen para ajustar la parte mas corta (ancho o alto) a las medidas deseadas y despues se recorta la parte central, ejemplo:
$_img->resizeToFit(300, 300); $margins === true => Se redimensiona la imagen para ajustar la parte mas grande (ancho o alto) y se agrega un margen (arriba/abajo o izquierda/derecha)... habra que ver si podemos cambiar el color de este... ejemplo:
$_img->resizeToFit(300, 300, true);