Cómo cambiar el tamaño de las restricciones de mantenimiento de imagen php

He hecho dos GIF para explicar lo que trato de hacer. Donde el borde gris es las dimensiones que estoy buscando (700 * 525). Ellos están en el fondo de esta pregunta.

Quiero que todas las imágenes que sean más grandes que el ancho y la altura indicados se escalen hasta el borde (desde el centro) y luego recorten los bordes. Aquí hay un código que he reunido para intentar esto:

if ($heightofimage => 700 && $widthofimage => 525){ if ($heightofimage > $widthofimage){ $widthofimage = 525; $heightofimage = //scaled height. //crop height to 700. } if ($heightofimage < $widthofimage){ $widthofimage = //scaled width. $heightofimage = 700; //crop width to 525. } }else{ echo "image too small"; } 

Aquí hay algunos GIF que explican visualmente lo que estoy tratando de lograr:

GIF 1: Aquí las proporciones de la imagen son demasiado en la dirección x

enter image description here

GIF 2: Aquí las proporciones de la imagen son demasiado en la dirección y

enter image description here


comparación de calidad de imagen para @timclutton

así que he usado tu método con PHP (haz clic aquí para hacer tu propia prueba con el php) y luego lo comparé con la foto original ¡ya que puedes ver que hay una gran diferencia !:

Su método de PHP :

http://tragicclothing.co.uk/video%20images/test/yo.jpg

El archivo real:

enter image description here


El siguiente código debería hacer lo que quieras. No lo he probado exhaustivamente, pero parece funcionar en las pocas imágenes de prueba que hice. Hay una pequeña duda en el fondo de mi mente de que en alguna parte mi matemática es incorrecta, pero es tarde y no puedo ver nada obvio.

Editar : Se revolvió lo suficiente que volví a pasar y encontré el error, que era que el recorte no estaba en el medio de la imagen. Código reemplazado por versión de trabajo.

En resumen: ¡trate esto como un punto de partida, no como un código listo para la producción!

 .png'); // get image dimensions. $w = imagesx($in); $h = imagesy($in); if ($w >= $target_w && $h >= $target_h) { // get scales. $x_scale = ($w / $target_w); $y_scale = ($h / $target_h); // create new image. $out = imagecreatetruecolor($target_w, $target_h); $new_w = $target_w; $new_h = $target_h; $src_x = 0; $src_y = 0; // compare scales to ensure we crop whichever is smaller: top/bottom or // left/right. if ($x_scale > $y_scale) { $new_w = $w / $y_scale; // see description of $src_y, below. $src_x = (($new_w - $target_w) / 2) * $y_scale; } else { $new_h = $h / $x_scale; // a bit tricky. crop is done by specifying coordinates to copy from in // source image. so calculate how much to remove from new image and // then scale that up to original. result is out by ~1px but good enough. $src_y = (($new_h - $target_h) / 2) * $x_scale; } // given the right inputs, this takes care of crop and resize and gives // back the new image. note that imagecopyresized() is possibly quicker, but // imagecopyresampled() gives better quality. imagecopyresampled($out, $in, 0, 0, $src_x, $src_y, $new_w, $new_h, $w, $h); // output to browser. header('Content-Type: image/png'); imagepng($out); exit; } else { echo 'image too small'; } ?> 

Usando Imagick :

 define('PHOTO_WIDTH_THUMB', 700); define('PHOTO_HEIGHT_THUMB', 525); $image = new Imagick(); $image->readImage($file_source); $width = $image->getImageWidth(); $height = $image->getImageHeight(); if($width > $height){ $image->thumbnailImage(0, PHOTO_HEIGHT_THUMB); }else{ $image->thumbnailImage(PHOTO_WIDTH_THUMB, 0); } $thumb_width = $image->getImageWidth(); $thumb_height = $image->getImageHeight(); $x = ($thumb_width - PHOTO_WIDTH_THUMB)/2; $y = ($thumb_height - PHOTO_HEIGHT_THUMB)/2; $image->cropImage(PHOTO_THUMB_WIDTH, PHOTO_THUMB_HEIGHT, $x, $y); $image->writeImage($thumb_destination); $image->clear(); $image->destroy(); unlink($file_source); 

He usado la biblioteca de GD para lograr el cambio de tamaño. Básicamente, lo que hice fue calcular la dimensión de la imagen y luego redimensioné la imagen a la dimensión 700×525 desde el centro.

  

Utilicé http://phpthumb.sourceforge.net para tener una solución hermosa también con bordes curvos transparentes.

esta es una ruta alternativa a la solución, puede satisfacer la necesidad de alguien con poca configuración.