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 da. La imagen se redimensiona para adaptarse 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. el uso
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:
$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);
en realidad esta secuencia de comandos no cambia el tamaño de la imagen original. ¿Eso también es posible? – sanders
Este script hace una copia de la imagen original. Cuando remuestree una imagen, tendrá que hacer una copia. Mi uso de ejemplo destruye la imagen original (imagedestroy ($ i)). Si desea sobrescribir el archivo de imagen, simplemente escriba $ pulgar en el archivo "img.jpg" en el ejemplo. – gnud
Ok gracias. ¿Qué pasa si quiero cambiar el tamaño de la imagen completa y no hacer solo una cosecha? – sanders