Foros del Web » Programando para Internet » PHP »

Creación de thumbnails con PHP

Estas en el tema de Creación de thumbnails con PHP en el foro de PHP en Foros del Web. Tengo una página tipo catálogo de imágenes. Actualmente, funciona así: - Un subdirectorio 'catalog' almacena todos los archivos de imágenes, cada una pesa alrededor de ...
  #1 (permalink)  
Antiguo 22/10/2005, 07:35
 
Fecha de Ingreso: mayo-2004
Mensajes: 95
Antigüedad: 13 años, 7 meses
Puntos: 0
Pregunta Creación de thumbnails con PHP

Tengo una página tipo catálogo de imágenes. Actualmente, funciona así:

- Un subdirectorio 'catalog' almacena todos los archivos de imágenes, cada una pesa alrededor de los 300K.
- Una base de datos contiene los registros (Referencia, Descripción, Nombre del archivo de imagen)

Cuando muestra la página, se hace en una tabla que se actualiza con los registros de la base de datos. El problema está en que en dicha tabla se debe mostrar un 'thumbnail' o imagen de previsualización pequeña. En este momento, está puesto de la siguiente manera:

Código:
<img src='catalog/<?php row['3'] ? width=30 height=30>'
Haciéndolo así, cada 'thumbanil' a pesar de aparecer de tamaño 30x30, es muy pesado, por lo que, si existen muchos registros almacenados la página sería realmente tediosa de descargar. Mi pregunta es, cómo debo hacer para enseñar una imagen más pequeña, es decir, tener 'thumbnails' de mis imágenes. He intentado utilizando el 'createimagefromjpeg' de PHP, pero sin éxito (en verdad NO entiendo cómo funciona) y he tratado de utilizar algunos scripts de thumbnails sin éxito. ¿Alguien puede ayudarme?
  #2 (permalink)  
Antiguo 22/10/2005, 10:28
Avatar de tyo100  
Fecha de Ingreso: febrero-2005
Ubicación: Monterrey, NL
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 1
Pues segun yo asi como le haces, lo unico que pasa es que una imagen de 400x400 la forzas a que ocupe un espacio de 30x30(ocupe un espacio no mida), crear thumnails en linea tambien puede ser algo pesado para el servidor te recomiendo que bajes irfanview, generes thumbnails de toda tu carpeta y los guades en catalago/thumbs/ asi solo cambiarias esto en tu codigo
<img src='catalog/thumbs/<?php row['3']?>'>.


Salu2
__________________
Desde la tierra de los nopales, las tortillas de maiz, y en cuya ciudad se encuenta el cerro de la silla.
NalgAss Web
SpiderMex - La Historia del Hombre Araña en MEXICO
  #3 (permalink)  
Antiguo 22/10/2005, 13:25
 
Fecha de Ingreso: mayo-2004
Mensajes: 95
Antigüedad: 13 años, 7 meses
Puntos: 0
Sí, pero ahora el problema es que las imágenes son añadidas de manera eventual a través de la misma página...necesito algo que me cree los thumbnails (o sea que me grabe en la carpeta thumbs de forma automatizada) cada vez que un usuario ingrese una foto normal.
  #4 (permalink)  
Antiguo 22/10/2005, 14:37
Avatar de tyo100  
Fecha de Ingreso: febrero-2005
Ubicación: Monterrey, NL
Mensajes: 475
Antigüedad: 12 años, 10 meses
Puntos: 1
busca en este foro han posteado varios scripts para crear thumbnails
__________________
Desde la tierra de los nopales, las tortillas de maiz, y en cuya ciudad se encuenta el cerro de la silla.
NalgAss Web
SpiderMex - La Historia del Hombre Araña en MEXICO
  #5 (permalink)  
Antiguo 23/10/2005, 08:05
 
Fecha de Ingreso: mayo-2004
Mensajes: 95
Antigüedad: 13 años, 7 meses
Puntos: 0
Gracias por tu colaboración, ¿me puedes suministrar algún link para algún thread relacionado? Estuve buscando pero no encontré.
  #6 (permalink)  
Antiguo 23/10/2005, 08:26
Avatar de JavierB
Colaborador
 
Fecha de Ingreso: febrero-2002
Ubicación: Madrid
Mensajes: 25.052
Antigüedad: 15 años, 9 meses
Puntos: 771
Hola hmartins

¿Has mirado en las FAQs?

Saludos,
  #7 (permalink)  
Antiguo 23/10/2005, 08:46
 
Fecha de Ingreso: mayo-2004
Mensajes: 95
Antigüedad: 13 años, 7 meses
Puntos: 0
En realidad no había buscado allí, aparece un script que se veía muy bueno, sin embargo no funcionó, es decir, no crea la imagen por alguna razón que desconozco pues, cambié el subdirectorio de creación al adecuado, fijé la permisología y tengo instalada la librería que me pide el script (de hecho...no me da ningún error el script, simplemente no hace lo que debe)
  #8 (permalink)  
Antiguo 23/10/2005, 14:39
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 12 años, 2 meses
Puntos: 0
Funcion Thumbnails

Yo tenía la misma pregunta que tú hace unas semanas y, encontré esta función por aquí:

Código PHP:
<?
function thumb($imagen,$altura) {
     
// Lugar donde se guardarán los thumbnails respecto a la carpeta donde está la imagen "grande".
     
$dir_thumb "imagenes_thumbs/";
     
// Prefijo que se añadirá al nombre del thumbnail. Ejemplo: si la imagen grande fuera "imagen1.jpg",
     // el thumbnail se llamaría "tn_imagen1.jpg"
     
$prefijo_thumb "tn_";

     
// Aquí tendremos el nombre de la imagen.
     
$nombre=basename($imagen);
     
// Aquí la ruta especificada para buscar la imagen.
     
$camino=dirname($imagen)."/";

     
// Intentamos crear el directorio de thumbnails, si no existiera previamente.
     
if (!file_exists($camino.$dir_thumb))
          @
mkdir ($camino.$dir_thumb0777) or die("No se ha podido crear el directorio ".$camino.$dir_thumb);

     
// Aquí comprovamos que la imagen que queremos crear no exista previamente
     
if (!file_exists($camino.$dir_thumb.$prefijo_thumb.$nombre)) {
          echo 
$camino.$dir_thumb.$prefijo_thumb.$nombre." NO existía<br>\n";
          
$img = @imagecreatefromjpeg($camino.$nombre) or die("No se encuentra la imagen $camino$nombre<br>\n");

          
// miramos el tamaño de la imagen original...
          
$datos getimagesize($camino.$nombre) or die("Problemas con $camino$nombre<br>\n");

          
// intentamos escalar la imagen original a la medida que nos interesa
          
$ratio = ($datos[1] / $altura);
          
$anchura round($datos[0] / $ratio);

          
// esta será la nueva imagen reescalada
          
$thumb imagecreatetruecolor($anchura,$altura);

          
// con esta función la reescalamos
          
imagecopyresampled ($thumb$img0000$anchura$altura$datos[0], $datos[1]);

          
// voilà la salvamos con el nombre y en el lugar que nos interesa.
              
imagejpeg($thumb,$camino.$dir_thumb.$prefijo_thumb.$nombre);

     }
}
?>
Espero que te sirva!!
Un saludo!!!!!!
  #9 (permalink)  
Antiguo 23/10/2005, 14:43
 
Fecha de Ingreso: mayo-2004
Mensajes: 95
Antigüedad: 13 años, 7 meses
Puntos: 0
Ésa fue la que intenté usar y no me funcionó, ¿me podrías decir cómo la utilizaste exactamente?
  #10 (permalink)  
Antiguo 23/10/2005, 17:10
Avatar de macabro  
Fecha de Ingreso: enero-2003
Ubicación: venus >> ((_\
Mensajes: 254
Antigüedad: 14 años, 10 meses
Puntos: 1
Bueno aqui te dejo uno que me sirve de mucho, lo saque de funkgallery ( http://www.funkgallery.co.uk/ ) aunque me costo semanas en adaptarlo a mi formulario valio la pena, si a alguien le sirve de mucho , de nada
primero lo que tienes que crear es una funcion, si tienes un archivo de funcion.php pues agregale esta funcion y si no pues crea uno con ese nombre de funcion.php
Código PHP:

<?php

//FUNCION.PHP
/* A DIE SUBROUTINE (a funky one :p)- TAKE ERROR AND MSG FROM INPUT */
function funkdie($error,$msg) {
global 
$myhtml;
$trcolor="#EEEEEE";
$trtext="BLACK";
$alt1="WHITE";
$boardname="yo";
echo 
"<p><table cellspacing=\"1\" cellpadding=\"4\" border=\"0\" width=\"100%\">
<tr bgcolor=\"$trcolor\"><td><font color=\"$trtext\">
<span class=\"ms\"><b>$error</b></span>
</font></td></tr>
<tr bgcolor=\"$alt1\"><td>
$msg
</td></tr>
</table></p>
"
;
//echo forum_jump();
//$myhtml->end_html();
exit;
}
// Resize uploaded avatars to a sensible size

function ResizeImage($im,$maxwidth,$maxheight,$name,$sname){
 echo 
"Resizing thumbnail image.<br>";
if (!
$im) {echo "Error passing filename.";
           die;
          } 
$width imagesx($im);
$height imagesy($im);
if((
$maxwidth && $width $maxwidth) || ($maxheight && $height $maxheight)){
if(
$maxwidth && $width $maxwidth){
$widthratio $maxwidth/$width;
$RESIZEWIDTH=true;
}
if(
$maxheight && $height $maxheight){
$heightratio $maxheight/$height;
$RESIZEHEIGHT=true;
}
if(
$RESIZEWIDTH && $RESIZEHEIGHT){
if(
$widthratio $heightratio){
$ratio $widthratio;
}else{
$ratio $heightratio;
}
}elseif(
$RESIZEWIDTH){
$ratio $widthratio;
}elseif(
$RESIZEHEIGHT){
$ratio $heightratio;
}
$newwidth $width $ratio;
$newheight $height $ratio;
if(
function_exists("imagecopyresampled")){
$newim imagecreatetruecolor($newwidth$newheight);

imagecopyresampled($newim$im0000$newwidth$newheight$width$height);
}else{
$newim imagecreate($newwidth$newheight);
imagecopyresized($newim$im0000$newwidth$newheight$width$height);
}
ImageJpeg ($newim,$sname);
ImageDestroy ($newim);
}else{
ImageJpeg ($im,$sname);
}
}

function 
check_jpeg($f$fix ){
# [070203]
# check for jpeg file header and footer - also try to fix it
  
if ( false !== (@$fd fopen($f'r+b' )) ){
    if ( 
fread($fd,2)==chr(255).chr(216) ){
      
fseek $fd, -2SEEK_END );
      if ( 
fread($fd,2)==chr(255).chr(217) ){
        
fclose($fd);
        return 
true;
      }else{
        if ( 
$fix && fwrite($fd,chr(255).chr(217)) ){return true;}
        
fclose($fd);
        return 
false;
      }
    }else{
fclose($fd); return false;}
  }else{
    return 
false;
  }
}
?>
despues en el formulario donde se inserta tiodo agregalo esta linea
<?
$un=$HTTP_POST_FILES['userfile']; ?>
<input type="file" name="userfile" size=45>

Ok durante el proceso hacemos lo copiamos este codigo que se encargara de reduicir la imagen y no te olvides de incluir en la parte de arriva la funcion.php
Código PHP:

include "funcion.php";
<?php
//pasamos las fotos al folder photos                            
$uploaddir "../images/photos/";
 
$un=$HTTP_POST_FILES['userfile']['name'];
$un=$thingy=str_replace(" ","_",$un);
$uploadfile $uploaddir.$un;

$uploadthumb=str_replace("photos","thumbs",$uploadfile);

$ftype=($HTTP_POST_FILES['userfile']['type']); 
if (
$ftype<>'image/gif' AND $ftype<>'image/jpeg' AND $ftype<>'image/pjpeg'funkdie("Error","Wrong file type - GIF or JPG ONLY.");


if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
  print 
"File is valid and was successfully uploaded.<br>";
} else {
  print 
"Error uploading file! Here's some debugging info:<br>";
  print 
"UPF = ".$uploadfile."<br>FTYPE = ".$ftype."<br>UPTHUMB = ".$uploadthumb."<br>UN = ".$un."<br>";
  
print_r($_FILES);
  die;
}
    
//chmod($uploadfile,0777);

$twidth=90;
$theight=90;

$FILENAME=$uploadfile;
$RESIZEWIDTH=$twidth;
$RESIZEHEIGHT=$theight;

echo 
"Uploaded $uploadfile <br>";
if (
$ftype=="image/jpeg" or $ftype=="image/pjpeg") {
 echo 
"Checking JPEG file structure.<br>";
 
check_jpeg($uploadfile$fix=);
 echo 
"Creating thumbnail.<br>";
 
$im imagecreatefromjpeg($uploadfile);
    if(!
$im) {echo "Error while creating thumbnail<br>File Uploaded - $uploadfile";
              die;
              }
} elseif (
$ftype=="image/gif")  {
 echo 
"Creating thumbnail.<br>";
 
$im imagecreatefromgif($uploadfile);
    if(!
$im) {echo "Error while creating thumbnail";
              die;
              }
}

        
ResizeImage($im,$RESIZEWIDTH,$RESIZEHEIGHT,$uploadfile,$uploadthumb);

?>
y donde insertas los datos coloca esto
Código PHP:
$sql "INSERT INTO tabla ( campo1, campo2, imagen, campo4) VALUES ('$campo1','$campo2', '$un','$campo4');
 if (@mysql_query($sql)) {

        echo("
<P>Su insercion ha sido con exito!! <a href='agregar.php'>agregar de nuevo</a> &nbsp; <a href='index.php'>Regresar</a></P>"); 
      } else { 
        echo("
<P>error al insertar".mysql_error()."</P>"); 
      } 
Bueno obviemente tienes que tener una carpeta donde cuardas las imagenes
crea una carpeta de "images" dentro de esa crea una que diga "photos" y otra de "thumbs" y listo .
Bueno espero te sirva de algo esto chau.
  #11 (permalink)  
Antiguo 24/10/2005, 07:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
La mayoría de códigos que has probado ocultan sus posibles mensajes de error usando @ delante de algunas funciones.

Tal vez tu tengas algún problema concreto (podría ser con las librerías GD?) .. o de otro tipo, pero .. si no vemos el mensaje de error nunca podrás darle alguna solución mas que probar y probar códigos.

Intenta tomar un ejemplo (el que gustes... algo simple), quita todo @ que veas y ejecuta tu código .. ahí deberías empezar a ver algún mensaje de error que explique tu problema concreto. Si pese a eso no obtienes mensajes de error, por favor centrate en un sólo código y vamos viendo pruebas para intentar detectar el error. Cuando -ese- código te funcione .. es muy probable que -otros- ejemplos de los que por aquí te han dejado también te funcionen.

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:39.