Foros del Web » Programando para Internet » PHP »

Thumbnails para todo tipo de imágenes

Estas en el tema de Thumbnails para todo tipo de imágenes en el foro de PHP en Foros del Web. Hola. Estaba buscando cómo poder hacer thumbnails en PHP para todo tipo de imágenes (.gif, .jpeg, .png ...) en un mismo código. Estuve buscando y ...
  #1 (permalink)  
Antiguo 17/06/2008, 10:54
 
Fecha de Ingreso: mayo-2008
Mensajes: 30
Antigüedad: 15 años, 11 meses
Puntos: 0
Thumbnails para todo tipo de imágenes

Hola. Estaba buscando cómo poder hacer thumbnails en PHP para todo tipo de imágenes (.gif, .jpeg, .png ...) en un mismo código. Estuve buscando y encontré lo siguiente:

Código PHP:

$fuente 
= @imagecreatefromjpeg($ruta);
$imgAncho imagesx ($fuente);
$imgAlto =imagesy($fuente);
$imagen ImageCreate($ancho,$alto);

ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$alto,$imgAncho,$imgAlto);

Header("Content-type: image/jpeg");
imagejpeg($imagenimagenPequena.jpeg); 
El problema es que sólo admite jpeg y no sabría como hacer que aceptase todo tipo de imagenes en un mismo código. ¿Cogiendo la extensión del archivo y con varios IF, o hay algún método más cómodo?
  #2 (permalink)  
Antiguo 17/06/2008, 14:53
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Thumbnails para todo tipo de imágenes

A mi se me ocurre esto:
Código PHP:

$parts
=explode(".",$fichero); 
$ext=$parts[count($parts)-1];  //obtenemos la extension
eval("\$image=imagecreatefrom$ext(\$fichero);");

//Tratamos la imagen

eval("image$ext(\$image,'thumb2_$fichero');"); 
El problema esta en el ultimo eval. Si el resultado lo queremos meter en un fichero, funciona sin problemas, como se muestra en el código... pero si lo que queremos es volcar la imagen al navegador (es decir, si no le especificamos el segundo parámetro) el código anterior falla.

Según la documentación de eval (http://www.php.net/eval) indica que para hacer eso habria que jugar con las funciones de control de salida (http://es.php.net/manual/es/ref.outcontrol.php), pero todavia no se como...

¿Alguna otra idea?
  #3 (permalink)  
Antiguo 17/06/2008, 15:02
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnails para todo tipo de imágenes

la otra es usar funciones variables, sin eval().... genial!

$ext ya la hemos definido entre jpeg/png/gif/wbmp

Código PHP:
$func 'createimagefrom' $ext;
$img $func('mi_imagen.png');

$func 'image' $ext;
$func($img); // OK 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 17/06/2008, 15:11
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Thumbnails para todo tipo de imágenes

chapeau!
  #5 (permalink)  
Antiguo 17/06/2008, 16:53
 
Fecha de Ingreso: mayo-2008
Mensajes: 30
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Thumbnails para todo tipo de imágenes

Basándome en lo que habéis dicho, he escrito lo siguiente:

Código PHP:
$parts=explode(".",$ruta); 
$ext=$parts[count($parts)-1];
$func 'createimagefrom' $ext;
$fuente = @$func($ruta);
$imgAncho imagesx ($fuente);
$imgAlto =imagesy($fuente);
$imagen ImageCreate($ancho,$alto);

ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$alto,$imgAncho,$imgAlto);

Header("Content-type: image/jpeg");
imagen($imagenimagenPequena.jpeg); 
Pero algo funciona mal porque no me guarda el archivo. ¿Sabéis que puede ser?

EDIT: Creo que el problema esta en $fuente = @$func($ruta);

Última edición por iHabieru; 17/06/2008 a las 17:05
  #6 (permalink)  
Antiguo 17/06/2008, 18:05
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnails para todo tipo de imágenes

una puede ser el error de JPG, ya que esa puede ser la extensión... y no JPEG, corrige este defecto... es necesario jpeg y no jpg, por el nombre de la función....

demás, no pongas la @ ya que el error es útil, para depurar el código...

PDTA: esta linea que hace??? esta bien escrita???

Código PHP:
imagen($imagenimagenPequena.jpeg); 
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 17/06/2008, 18:22
 
Fecha de Ingreso: mayo-2008
Mensajes: 30
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Thumbnails para todo tipo de imágenes

Sin el @, el error que da es: Call to undefined function: createimagefromgif()

Cita:
PDTA: esta linea que hace??? esta bien escrita???
Guarda el archivo en el servidor con el nomre imagenPequeña.jpeg.
  #8 (permalink)  
Antiguo 18/06/2008, 05:32
 
Fecha de Ingreso: mayo-2008
Mensajes: 30
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: Thumbnails para todo tipo de imágenes

Vale, la función es imagecreatefrom y no createimagefrom XD

Lo he dejado algo así:
Código PHP:
$parts=explode(".",$ruta); 
$ext=$parts[count($parts)-1]; // Coge la extensión
$func "imagecreatefrom" $ext;
$fuente = @$func($ruta);
$imgAncho imagesx ($fuente);
$imgAlto imagesy($fuente);
$imagen = @imagecreate(200150); //X e Y

ImageCopyResized($imagen,$fuente,0,0,0,0,200,150,$imgAncho,$imgAlto); //Crea el thumbnails

$func2 "image" $ext;
Header("Content-type: image/" $ext);
$nuevo time().".jpg"//Le doy al archivo como nombre la hora
$func2($imagen$nuevo); //Guarda el archivo 
Ahora el problema es con los archivos JPG. Porque como ya habéis dicho antes, la extensión es JPEG y no JPG y por tanto no puede hacer un thumbnail de los archivos .jpg, solo .jpeg ... Y con .bmp ocurre lo mismo, ya que es wbmp ¿A alguien se le ocurre algo?

Última edición por iHabieru; 18/06/2008 a las 06:01
  #9 (permalink)  
Antiguo 18/06/2008, 08:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnails para todo tipo de imágenes

es algo sencillo.... vaya, ya resolviste el primer acertijo.... el otro es igual de fácil

primer, respalda la extensión original... copiala en $ext2, esta es la que usara el archivo.... no la función!!! (por ejemplo)

solo haces unos cuantos IF y bingo!!!

Código PHP:
$ext2=$ext;

if (
$ext=='jpg'$ext='jpeg';
elseif (
$ext=='bmp'$ext='wbmp'
y ya..... verdad que es fácil?

PDTA: eso si.... debes usar $ext2 (o como prefieras) para el nuevo archivo, y el content-type, ya que si abres un BMP y lo guardas como JPEG puede haber errores....
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #10 (permalink)  
Antiguo 18/06/2008, 08:35
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Thumbnails para todo tipo de imágenes

Personalmente creo que los IF quitan toda la gracia a la solución. La idea era evitarlos, vamos, eso suponía yo.

Si haces una serie de IF para las extensiones.... también puedes hacerlo para los imagecreatefrom*...

Saludos.
  #11 (permalink)  
Antiguo 18/06/2008, 08:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnails para todo tipo de imágenes

pues es que no hay manera de evitarlos.... es una solución extremadamente lógica, y básica!!!

la única solución (la otra) seria usar IF's cortos....

Código PHP:
$ext = ($ext=='jpg''jpeg': ($ext=='bmp''wbmp'$ext)); 
sino.... quisiera ver otra forma de hacer esto.... ya que eso valen los IF

"si la extensión es JPG la cambio a JPEG" (me es mas útil)
sino, y la extensión es BMP, pues la cambio a WBMP"


PDTA: yo no le veo la falta de gracia, deveras!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #12 (permalink)  
Antiguo 18/06/2008, 12:52
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Thumbnails para todo tipo de imágenes

Si, tienes razón, está claro que en este caso en concreto, y para muchos otros casos, no te puedes quitar la casuística.

Lo único es que a mi, personalmente, no me gusta reflejar la casuística en la implementacion, y dejarla más bien en secciones de definicion.

Si implementas IF's, secciones de switch y o cualquier otra enumeracion de casos, en cuanto te cambie la casuistica, tienes que estar cambiando codigo. Imaginate que sale una nueva funcion imagefromCOSA para los archivos .COS, ya tienes que meter otro IF y cambiar el codigo para reflejar los .cos a 'cosa'

Para estos casos, yo prefiero una solucion de este tipo:

Código PHP:
$excepciones=array('jpg'=>'jpeg','bmp'=>'wbmp','cos'=>'cosa');

$ext=isset($excepciones[$ext])?$excepciones[$ext]:$ext
Date cuenta que la variable $excepciones se puede considerar "configuracion", una variable que te puedes llevar a un fichero conf.php y agregar futuras excepciones, futuras casuísticas... y no tendras que modificar nada de codigo.

No quiero que veas esta contestación como alguien que quiere hacerte la contra, eh? solo quiero mostrar una vision mas "purista" de las casuísticas, ya que inicialmente lo que buscaba iHabieru es generar código lo mas generico posible.

Y ya de paso, me gusta discutir cosas con gente que se que controla, para saber sus puntos de vista :)

Saludos cordiales
  #13 (permalink)  
Antiguo 18/06/2008, 13:53
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Thumbnails para todo tipo de imágenes

que bien.... yo no sabia eso de lo que nos hablas... es una manera perfecta de hacer genérico un código, puro..... claro y puro....

gracias, super...

:D

Edito:

- demás, serán poquitos caracteres de diferencia... quizá estética mas, o menos...
- pero es importante para todos este gran detalle, de verdad quedo muy claro...
- sobre todo, que es un método extensible y fácilmente mantenible... y no en otros casos, como regularmente hacemos... switch, if/elseif, etc... (esto debe ser aporte)

suerte!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Última edición por pateketrueke; 18/06/2008 a las 13:57 Razón: gratificaciones
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 01:48.