tamaño subir script redimensionar recortar para imagenes imagen imagecopyresampled con cambiar antes php resize crop

php - subir - Cambiar el tamaño/recortar/rellenar una imagen a un tamaño fijo



resize imagen con php (11)

son estas miniaturas? si lo están, cosechar no es un gran problema. lo hacemos todo el tiempo Ni siquiera rehúso cultivar proporciones arbitrarias en las miniaturas cuadráticas paralizadas, arruinando por completo la imagen (sí, soy tan hardcore ), si solo se ve bien. esta es la respuesta de un diseñador a una pregunta técnica, pero aún así. no temas la cosecha!

Necesito cambiar el tamaño de una imagen a un tamaño fijo. Pero tiene que mantener los factores entre el ancho y la altura.

Digamos que quiero cambiar el tamaño de una imagen de 238 (w) X 182 (h) a 210 / 150

Lo que hago ahora es:

Original width / target width = 1.333333 Original Height / target Height = 1.213333

Ahora tomo el factor más pequeño.

Ahora siempre tengo el ancho correcto desde 238 / 1.333333 = 210 . Pero la altura sigue siendo 160 .

¿Cómo puedo bajar la altura a 160 sin arruinar la foto?

¿Necesito recortar? ¿Si es así, cómo?


La técnica es:

  1. cambie el tamaño de la imagen para que una dimensión coincida mientras que la otra excede las dimensiones deseadas
  2. saque la imagen del tamaño deseado del centro de la imagen redimensionada.

Por último, si está desconcertado acerca de cómo hacer el cambio de tamaño de las matemáticas, recuerde que si las proporciones de las imágenes de origen y de destino son las mismas, esta relación se cumple:

SourceWidth / SourceHeight = DestinationWidth / DestinationHeight

Si conoce tres parámetros, puede calcular el cuarto fácilmente.

Escribí un artículo sobre esto:
Recortar para ajustar una imagen usando ASP / PHP


¿Tienes Imagick ? Si es así, puedes cargar la imagen con ella y hacer algo como thumbnailimage()

Allí puede omitir cualquiera de los parámetros (alto o ancho) y cambiará el tamaño correctamente.


Cambiar el tamaño de las imágenes desde una página web con PHP puede ser problemático. Las imágenes más grandes (que se aproximan a 2 + MB en el disco) pueden ser tan grandes que necesitan más de 32 MB de memoria para procesar.

Por esa razón, tiendo a hacerlo desde un script basado en CLI, con hasta 128 MB de memoria disponible para él, o una línea de comando estándar, que también usa todo lo que necesita.

# where to put the original file/image. It gets resized back # it was originally found (current directory) SAFE=/home/website/PHOTOS/originals # no more than 640x640 when finished, and always proportional MAXSIZE=640 # the larger image is in /home/website/PHOTOS/, moved to .../originals # and the resized image back to the parent dir. cd $SAFE/.. && mv "$1" "$SAFE/$1" && / convert "$SAFE/$1" -resize $MAXSIZE/x$MAXSIZE/> "$1"

''convertir'' es parte de las herramientas de línea de comandos de ImageMagick.


Creo que hay un poco de confusión. Si solo quieres cambiar el tamaño, manteniendo la relación original, la operación correcta es:

$ratio = $originalWidth / $originalHeight; if(//you start from the width, and want to find the height){ $newWidth = $x; $newHeight = $x / $ratio; }else if(//you start from the height, and want to find the width){ $newHeight = $x; $newWidth = $x * $ratio; }

De lo contrario, si el nuevo ancho anotado y la nueva altura no se pueden cambiar, y la relación del dedo pulgar es diferente de la relación original, la única forma es recortar o agregar bordes al dedo pulgar.

Si está listo para tomar el camino correcto, esta función puede ayudarlo (lo escribí hace años en 5 minutos, tal vez necesite alguna mejora ... solo funciona con jpg, por ejemplo;):

function thumb_cut($nomeimage, $source_path, $destination_path, $new_width, $new_height){ list($width, $height, $type, $attr) = getimagesize($source_path.$nomeimage); if($type == 2){ if($width > $new_width){ $new_width = $width; $new_height = $height; } $compression = 100; $destimg = imagecreatetruecolor($new_width,$new_height) or die("Problems creating the image"); $srcimg = ImageCreateFromJPEG($source_path.$nomeimage) or die("problem opening the image"); $w = ImageSX($srcimg); $h = ImageSY($srcimg); $ro = $new_width/$new_height; $ri = $w/$h; if($ro<$ri){ $par = "h"; }else{ $par = "w"; } if($par == "h"){ $ih = $h; $conv = $new_width/$new_height; $iw = $conv*$ih; $cw = ($w/2)-($iw/2); $ch = ($h/2)-($ih/2); }else if($par == "w"){ $iw = $w; $conv = $new_height/$new_width; $ih = $conv*$iw; $cw = ($w/2)-($iw/2); $ch = ($h/2)-($ih/2); } ImageCopyResampled($destimg,$srcimg,0,0,$cw,$ch,$new_width,$new_height,$iw,$ih) or die("problems with resize"); ImageJPEG($destimg,$destination_path.$nomeimage,$compression) or die("problems with storing new image"); } }


Esto no recorta la imagen, pero deja espacio alrededor de la nueva imagen si es necesario, que creo que es un mejor enfoque (que recorte) al crear miniaturas.

$w = 210; $h = 150; $orig_w = imagesx($original); $orig_h = imagesy($original); $w_ratio = $orig_w / $w; $h_ratio = $orig_h / $h; $ratio = $w_ratio > $h_ratio ? $w_ratio : $h_ratio; $dst_w = $orig_w / $ratio; $dst_h = $orig_h / $ratio; $dst_x = ($w - $dst_w) / 2; $dst_y = ($h - $dst_h) / 2; $thumbnail = imagecreatetruecolor($w, $h); imagecopyresampled($thumbnail, $original, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $orig_w, $orig_h);


Prefiero cambiar el tamaño para que la imagen esté dentro de tu límite y luego completar las partes en blanco. Entonces, en el ejemplo anterior, cambiarías el tamaño para que la altura sea correcta y luego se llenaría (7 píxeles en cada extremo, creo) a la izquierda y a la derecha con un color de fondo.


Solo un consejo para la generación rápida de miniaturas de alta calidad a partir de imágenes grandes: ( desde el sitio php.net )

Si haces la generación de miniaturas en dos etapas:

  1. Desde una imagen original a una imagen intermedia con el doble de las dimensiones finales, utilizando un ajuste de tamaño rápido
  2. Desde la imagen intermedia hasta la miniatura final usando una nueva muestra de alta calidad

entonces esto puede ser mucho más rápido; el cambio de tamaño en el paso 1 es de calidad relativamente baja para su tamaño, pero tiene suficiente resolución adicional que en el paso 2 la calidad es decente, y la imagen intermedia es lo suficientemente pequeña como para volver a muestrear de alta calidad (que funciona bien con un tamaño 2: 1) procede muy rápido.


Tal vez echar un vistazo a PHPThumb (funciona con GD e ImageMagick)


Tendrás que recortar 5 px de la parte superior e inferior para llegar al tamaño objetivo, sin embargo, esto podría arruinar la imagen.

Realmente deberías tener un ancho o altura objetivo, luego ajustar la otra dimensión en la misma proporción.


Esta solución es básicamente la misma que la de Can Berk Güder, pero después de haber dedicado un tiempo a escribir y comentar, me apetecía publicar.

Esta función crea una miniatura que es exactamente tan grande como el tamaño que le das. La imagen cambia de tamaño para ajustarse mejor al tamaño de la miniatura. Si no se ajusta exactamente en ambas direcciones, se centra en el thumnail. Los extensos comentarios explican lo que sucede.

function thumbnail_box($img, $box_w, $box_h) { //create the image, of the required size $new = imagecreatetruecolor($box_w, $box_h); if($new === false) { //creation failed -- probably not enough memory return null; } //Fill the image with a light grey color //(this will be visible in the padding around the image, //if the aspect ratios of the image and the thumbnail do not match) //Replace this with any color you want, or comment it out for black. //I used grey for testing =) $fill = imagecolorallocate($new, 200, 200, 205); imagefill($new, 0, 0, $fill); //compute resize ratio $hratio = $box_h / imagesy($img); $wratio = $box_w / imagesx($img); $ratio = min($hratio, $wratio); //if the source is smaller than the thumbnail size, //don''t resize -- add a margin instead //(that is, dont magnify images) if($ratio > 1.0) $ratio = 1.0; //compute sizes $sy = floor(imagesy($img) * $ratio); $sx = floor(imagesx($img) * $ratio); //compute margins //Using these margins centers the image in the thumbnail. //If you always want the image to the top left, //set both of these to 0 $m_y = floor(($box_h - $sy) / 2); $m_x = floor(($box_w - $sx) / 2); //Copy the image data, and resample // //If you want a fast and ugly thumbnail, //replace imagecopyresampled with imagecopyresized if(!imagecopyresampled($new, $img, $m_x, $m_y, //dest x, y (margins) 0, 0, //src x, y (0,0 means top left) $sx, $sy,//dest w, h (resample to this size (computed above) imagesx($img), imagesy($img)) //src w, h (the full size of the original) ) { //copy failed imagedestroy($new); return null; } //copy successful return $new; }

Ejemplo de uso:

$i = imagecreatefromjpeg("img.jpg"); $thumb = thumbnail_box($i, 210, 150); imagedestroy($i); if(is_null($thumb)) { /* image creation or copying failed */ header(''HTTP/1.1 500 Internal Server Error''); exit(); } header(''Content-Type: image/jpeg''); imagejpeg($thumb);