Foros del Web » Programando para Internet » PHP »

Rapidez creacion dinamica imagenes.

Estas en el tema de Rapidez creacion dinamica imagenes. en el foro de PHP en Foros del Web. Estoy diseñando una galeria de imagenes que se crean dinamicamente. I me encuentro con dos problemas: 1. Al querer guardar las imagenes, el nombre que ...
  #1 (permalink)  
Antiguo 07/01/2004, 22:15
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Pregunta Rapidez creacion dinamica imagenes.

Estoy diseñando una galeria de imagenes que se crean dinamicamente. I me encuentro con dos problemas:

1. Al querer guardar las imagenes, el nombre que aparece a la hora de guardar es el nombre del fichero php que la ha generado.

2. Si tengo cómo mínimo 15 imagenes, me aparecen el tiípico "que la imagen no existe con la cruzecita roja" y eso es debido a que al servidor no le da tiempo a generar unas cuantas imagenes.

Hay alguna solución?

He hecho test de rapidez de crear iamgenes dinamicas y tengo instalado la versión Gd 2.x, pero usando createimage()+imagecopyresize es 14 veces mas rápido que createimagetruecolor()+imagecopyresize. Lo que passa es que en la versión 2.X no puedes uasr createimage pq te crea las imagenes a 256 colores en cambio en la verisón 1.X te las crea con todos los colores.

Creo que 14 veces más ràpido es muchisimo, y la rapidez radica en el uso de createimage() o createimagetruecolor().
  #2 (permalink)  
Antiguo 08/01/2004, 00:23
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 16 años, 4 meses
Puntos: 9
a ver a ver es al revez:

Con la versión 2.x del GD, creas imágenes en color real usando createimagetruecolor(), y si lo intentas con 1.x no existe la función, y crea los 256 colores, obviamente con createimage().

Ahora, para lograr eso que dices, que carguen mas rápido las imágenes, lo mejor es reducirlas de tamaño, tan sencillo como eso.
  #3 (permalink)  
Antiguo 08/01/2004, 06:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Reducirlas de tamaño .. pero sin descuidad el peso de estas nuevas imagenes creadas .. Para eso peudes generar JPG's con el ratio de compresión que quieras vs calidad que dé.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 08/01/2004, 07:46
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Hice unas estadisticas de creación de imagenes y salió cómo mejor ratio calidad/tamaño un 85%. Casi no havia una diferencia entre 80% 75% i 70% en cuanto a tamaño pero si en calidad.

Tengo puesta una calidad de 85%. Y por defecto si no enumeras la calidad, esta es por defecto de 75%.

Las imagenes originales que tengo van de un tamaño de 90kb a 20kb y las que envia dinamicamente al servidor ocupan sólo el 10% del tamaño original.

Entonces si tengo 15 imagenes x 4Kb-6Kb cada imagen de media = 60Kb-90Kb que me ocupa la pagina. (un tamaño normal de envio).

No creo que con 4Kb-6Kb el srevidor tenga problemas para la creacion de imagen en cuanto se refiere al tamaño, sinó que creo que es la cantidad de preticiones simultaneas para crearlas que hace que algunas peticiones no las pueda servir, I ESO QUE ESTOY TRABAJANDO EN LOCAL, que si fuera via hosting la cosa tendria que ir peor.

Teneis alguna solucion para el problema 1?

Me gustaria trabajar con imagecreate pq es sumamente más rapido que imagecreatetruecolor. No se si es possible tener dos versiones de la libreria GD instaladas simultaniamente, y la verdad es que desconozco cómo podria copiarlo en el hosting.

Alguna otra solucion?
  #5 (permalink)  
Antiguo 08/01/2004, 08:05
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
1. Al querer guardar las imagenes, el nombre que aparece a la hora de guardar es el nombre del fichero php que la ha generado.
El nombre del archivo php que se esté ejecutando puedes obtenerlo con la variable de servidor: PHP_SELF y para quedarte sólo con el nombre del script puedes aplicar: basename() ... quedando algo tipo:

Código PHP:
$nombre_script_actual=basename($_SERVER['PHP_SELF']); 

Cita:
createimagetruecolor()+imagecopyresize ...
Si bien createimagetruecolor() obtienes el "true color" .. con imagecoyresize() sólo puedes trabajar con 256 colores .. para eso debes usar en lugar de imagecopyresize() la función: imagecopyresampled() (en conjunto con createimagetruecolor() )

Cita:
Me gustaria trabajar con imagecreate pq es sumamente más rapido que imagecreatetruecolor. No se si es possible tener dos versiones de la libreria GD instaladas simultaniamente, y la verdad es que desconozco cómo podria copiarlo en el hosting.
Si en tu servicio de hosting usan GD 2.x .. siempre peudes usar GD 1.x funciones pero no al contrario .. Es más .. puedes hacerte condicionales tipo "quiero máxima resolución" y así usar por ejemplo imagecreate() o imagecreatetruecolor() según quieras más o menos profundidad de color. (todas las funciones de GD 1.x tiene sus equivalentes para GD 2.x con mas profundidad de color).

Sobre los tiempos de proceso .. Tu veras si tus imagenes se ven "aceptables" a 256 colores como para no usar las funciones que aportan mas profundidad de color y así ganar en rendimiento.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 08/01/2004, 08:08
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
Hola,

¿Cual es la razon por la que debes generar las imagenes cada vez? Es que para una galeria de imagenes no veo la razon para no realizar ese proceso solo una vez (cuando subes o modificas la imagen), guardarla en un fichero, y luego para las peticiones usar ese fichero. La unica razon podria ser el limite de espacio en disco duro, pero en ese caso en vez de crear el fichero para todas las imagenes , podrias hacerlo para las mas mostradas.

Es que es mas rapido hacer una cosa "costosa" una vez, que cada vez que pidan esa pagina.

Suerte.

PD: Supongo que tu problema es al crear los tipicos thumbnails o muestras de las imagenes de la galeria.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 08/01/2004, 08:39
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
En cuanto se refiere a los nombres de la imagenes, lo que quiero es que a la hora de guardar apareciera el nombre original de la imagen y no el nombre de la pagina que la envia al navegador dinamicamente. A esto no le veo solucion.

Si tienes la versión GD 1.X y usas imagecreate()+imagecopyresized , la calidad i profundidad de la imagen es igual que si usas GD 2.x y imagecreatetruecolor()+imagecopyresized. La única diferencia es que imagecreate() es sumamente más rapido que imagecreatetruecolor().

Pero no puedes usar imagecreate()+GD2.X pq la profundidad es de 256 colores y las imagenes se ven mal.

La única razon para que no guarde los thumbnails en disco es por no augmentar la espacio usado del hosting. I no puedo mostrar las mas mostradas ya que no uso una base de datos ( que tambien lo podria poner en un texto plano). La galeria de imagenes no usa BD, sinó que lista las imagenes que se encuentran en un subdirectorio.
  #8 (permalink)  
Antiguo 08/01/2004, 08:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
En cuanto se refiere a los nombres de la imagenes, lo que quiero es que a la hora de guardar apareciera el nombre original de la imagen y no el nombre de la pagina que la envia al navegador dinamicamente. A esto no le veo solucion.
Si pones el código que usas .. podremos ver el error .. En principio en el array $_FILES ( o si lo accedes global .. por $archivo_propiedad) tienes el nombre "temporal" que toma el archivo y el original .. ['tmp_name'] y ['name'] respectivamente de tu $_FILES['archivo'] ...

Cita:
Si tienes la versión GD 1.X y usas imagecreate()+imagecopyresized , la calidad i profundidad de la imagen es igual que si usas GD 2.x y imagecreatetruecolor()+imagecopyresized. La única diferencia es que imagecreate() es sumamente más rapido que imagecreatetruecolor().
Ya te lo he explicado anteriormente .. el problema es que estás usando imagecreateresize() (revisa el manual oficial y veras) .. En el momento que uses -una- función que no corresponda a "true color" .. todo resultado baja a la calidar inferior.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #9 (permalink)  
Antiguo 08/01/2004, 09:04
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 15 años, 5 meses
Puntos: 16
El punto 1 depende de como hagas lo de "descargar". Si simplemente es con el "Guardar imagen", creo que siempre guarda con el nombre especificado en el src del img. Podrias configurar el servidor para poder poner en ese src el nombre de de la imagen, usando las mismas tecnicas que para crear URLs amigables para buscadores: http://zonaphp.com/articulo30.php

Y sobre el espacio en disco duro, dices que el thumb ocupa 4-6kb. Eso significa que si la galeria tiene 1000 imagenes, seria simplemente unos 6 megas (que no me parece mucho). De todas formas, podrias especificar un espacio maximo en disco para los thumb (en un directorio). A la hora de mostrar los thumbs, compruebas primero si ya creaste el thumb (esta en el directorio de thumbs); si esta, muestras el fichero; si no esta, compruebas si has llegado al limite de espacio para thumbs, eliminas uno de los ficheros; y despues creas el fichero thumb. Lo ideal seria mantener en un fichero la lista de los ficheros y eliminarlos segun un criterio (el mas antiguamente accedido, el menos veces accedido, ...).

Eso si, en esta situacion ya seria evaluar si implementar esta "cache" cuesta (en recursos) mas que la generacion.

Por cierto, ahora que lo pienso, ¿cada thumb lo generas con una llamada a un script independiente? Porque si es asi, el problema esta en la ejecucion en paralelo del mismo script. Haz la prueba de aumentar en el php.ini el valor de memory_limit. Quizas mas que de velocidad, es un problema de memoria.

Suerte.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #10 (permalink)  
Antiguo 08/01/2004, 09:06
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
La verdad es que no creo que esto sea un error de programación. Me parece que no me hago entender. A mi las imagenes me las crea bien, es cuando se ven en el navegador y las quiero guardar con "Guardar imagen como.." el texto que me aparece es el nombre del archivo php que ha creado dinámicamente y no el que me guastaria a mi que es el nombre de la imagen original. Se ha entendido?

Aqui teneis el código.
Codigo html:
Código:
<img src='/welog/imagelist.php?&amp;m=0&amp;src=uploaded_images/image3.jpg&amp;width=149&amp;height=150' width=149 height=150  />
Codigo php (imagelist.php):
Código PHP:
if ($_GET['src']) {
    
Header"Content-type: image/jpeg");
    
$valores = array('method''ruta''ancho''alto''guardar''calidad');
    
$i=0;
    foreach (
$_GET as $key=>$val) {
        $
$valores[$i++]=$val;
    }
    if (!
$calidad$calidad 85;
    
    
$fuente ImageCreateFromJpeg($ruta); 
    
$imgAncho ImageSx($fuente); 
    
$imgAlto =ImageSy($fuente);
    
$func='imagecreatetruecolor';
    if (!
function_exists($func)) { 
        
$imagen=ImageCreate($ancho,$alto);
        
ImageCopyResized$imagen$fuente0000$ancho$alto$imgAncho$imgAlto);
    } else {
        
$imagen ImageCreateTrueColor($ancho,$alto);
        if (
$metodImageCopyResized$imagen$fuente0000$ancho$alto$imgAncho$imgAlto);      
        else 
ImageCopyResampled$imagen$fuente0000$ancho$alto$imgAncho$imgAlto); 
    }
    
ImageJpeg($imagen,$guardar,$calidad);
    
imageDestroy($imagen);

  #11 (permalink)  
Antiguo 08/01/2004, 09:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues .. si te fijas sólo estás usando una cabecera HTTP para indicarle al navegador que tipo de imagen es (Content-type: image/jpeg) .. pero hay muchas más que define que nombre va tener ese archivo y .. hasta indicaciones sobre su tamaña como para que gestores de descargas te calculen bien el tiempo de descarga y cuanto queda de la misma.

En esta FAQ tienes bastantes de las cabeceras HTTP que deberias usar:

http://www.forosdelweb.com/showthrea...781#post306781


Sobre todo presta atención a estas:

Código PHP:
header("Content-Length: " $tarchivo);
header("Content-Disposition: attachment; filename="."archivo.exe"); 
(creo que para imagenes incrustadas deberias usar "inline" en lugar de attachment)

que indican el tamaño del archivo (lo tendras que ver con filesize() o similar) y el nombre del archivo que le vas a dar).

Un saludo,

PD: ¿Ves que con el código en la mano se te entiende mejor?
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.

Última edición por Cluster; 08/01/2004 a las 09:17
  #12 (permalink)  
Antiguo 08/01/2004, 09:37
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Pues mira que tenia la convicción de que tenia la razón.
Mis humildes disculpas. Lo sabré para la próxima vez, pondré el código.

Lo de los headers, es un tema pendiente que tengo. Dónde puedo busca información de todas las possibilidades de cabeceas httprs en español?

Gracias
  #13 (permalink)  
Antiguo 08/01/2004, 09:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En español no sé .. pero las cabeceras HTTP son parte del protocolo HTTP/1.1:

ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt

Eso sería lo "oficial" y standard .. pero las cabeceras HTTP son interpretadas por los navegadores .. Así que no te extrañe que ciertas cabeceras (como las mencionadas) se comporten igual ante diferentes navegadores.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 08/01/2004, 10:28
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Sonrisa

Gracias. a los dos por vuestros mensajes. Ahora almenos ya se donde invertigar.

El código que os he enviado, lo optimizariais de alguna manera o le hariais algun cambio?


Cita:
Mensaje Original por josemi

Por cierto, ahora que lo pienso, ¿cada thumb lo generas con una llamada a un script independiente? Porque si es asi, el problema esta en la ejecucion en paralelo del mismo script.
A que te refieres? No comprendo muy bien cual seria el problema.
  #15 (permalink)  
Antiguo 08/01/2004, 10:39
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Cluster, me saco el sombrero. Funcionó a la primera. chapó!

$nombre=basename($_GET['src']);
Header("Content-type: image/jpeg");
Header("Content-Disposition: inline; filename=$nombre;");

Gracias, de corazón. Que alivio.
  #16 (permalink)  
Antiguo 08/01/2004, 10:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Me alegro jmaribau .. Ahora pruena el código en vários navegadores y versiones (por el tema de "standares" sobre las cabeceras HTTP que te hacia referencia).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #17 (permalink)  
Antiguo 08/01/2004, 11:02
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 13 años, 11 meses
Puntos: 0
Por cierto al poner inline, he solucionado el problema de las imagenes que no quedavan enlazadas, ahora el navegador espera que ser creen todas la imagenes. Hemos matado dos perdices de un sólo tiro.
  #18 (permalink)  
Antiguo 08/01/2004, 11:45
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues ese detallito no lo conocía... así que tomo nota xDD.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 00:21.