Foros del Web » Programando para Internet » PHP »

Problemón con imagecreatefromjpeg.

Estas en el tema de Problemón con imagecreatefromjpeg. en el foro de PHP en Foros del Web. Hola a todos! A ver si alguien me ayuda, lo que me pasa es rarísimo. Tengo una aplicación para subir imágenes. Cuando se sube la ...
  #1 (permalink)  
Antiguo 20/06/2006, 05:49
 
Fecha de Ingreso: febrero-2003
Ubicación: Madrid
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 0
Problemón con imagecreatefromjpeg.

Hola a todos!

A ver si alguien me ayuda, lo que me pasa es rarísimo. Tengo una aplicación para subir imágenes. Cuando se sube la imagen, ésta se reduce a un tamaño estándar para que no se vayan de madre, y se hace un thumbnail automáticamente. En mi servidor local que tengo montado en mi PC, me va perfectamente. Son funciones que he usado muchas veces. Pero cuando lo cuelgo en Arsys me da problemas.

He ido depurando y al final he visto que la línea en la que falla es:

$original = imagecreatefromjpeg($img_original);

He ido más allá: si subo una imágen de unos 100K, todo funciona perféctamente. Si la imagen pesa 300 y algo, esa línea me falla.

En phpinfo figura que puedo subir imágenes de hasta 8 megas, y el tiempo máximo de respuesta son 60 segundos, tiempo más que de sobra para subirme la imagen de 300 k (la sube en 20 segundos, así que eso no es).

¿Puede ser que tengan capada de alguna manera la librería GD en caso de que la imagen a cambiar de tamaño sea "pesada" (¡¡pero dónde se ha visto que 300 K sea mucho!!)? ¿Puedo burlar ese problema de alguna manera?

Os dejo con la función que cambia de tamaño y copia en la carpeta /images las imágenes que subo. Está un poco chapucera de tanta prueba y tanto cambio que he ido haciendo, pero creo que se entiende bien.

Código PHP:
ins_img($imagen,$ID,"galeria","imagen",&$nombre_imagen,&$dest);

//devuelve $nombre_imagen con el nombre de la imagen.
//le metemos la imagen que acabamos de subir, ID y tabla para crear el nombre del archivo que se guardará en la carpeta images. image_name y dest se devuelven.
function ins_img($image,$ID,$tabla,$nombre_campo,$image_name,$dest)
{
   if (
$image && $image != "")
   {
      global 
$basedir,$baseurl;

      
$image_name "/images/".$ID."_".$tabla."_".$nombre_campo;

      
$output getimagesize($image);
      if(
$output[2]==1)$image_type="image/gif";
      elseif(
$output[2]==2)$image_type="image/jpeg";
      elseif(
$output[2]==3)$image_type="image/png";

      switch (
$image_type)
      {
        case 
"image/gif":
            
$image_name $image_name.".gif";
            break;
        case 
"image/jpeg":
            
$image_name $image_name.".jpg";
            break;
        case 
"image/png":
            
$image_name $image_name.".png";
            break;
        case 
"image/bmp":
            
$image_name $image_name.".bmp";
            break;
        default:
            Print 
"ATENCIÓN: Tipo de archivo inválido como imágen<br>";
      }

              
//////////////
    
global $ancho_maximo$alto_maximo;
    
    
// obtener datos de la fotografia 
    
$img_original $image;
    
    
$info_original getimagesize($img_original); 
    
$anchura_original $info_original[0]; 
    
$altura_original $info_original[1]; 

    
// crear imagen desde el original 
    
$original ImageCreateFromJPEG($img_original); [B]//AQUI FALLA[/B]

    
ImageAlphaBlending($originaltrue);

    
$ratio 1//iniciamos a 1.

    
if ($info_original[0] > $ancho_maximo//Si es más ancha que el máximo, calcular el ratio: (actual*X = ancho_maximo)
    
{
        
$ratio $ancho_maximo/$info_original[0];
    }
    
    if (
$info_original[1]*$ratio $alto_maximo)
    {
        
$ratio $alto_maximo/$info_original[1];
    }
    
    
$anchura round($ratio*$info_original[0]);
    
$altura round($ratio*$info_original[1]);
    
    
$imagen_final imagecreatetruecolor($anchura,$altura);

   
    
// con esta función la reescalamos
    
imagecopyresampled ($imagen_final$original0000$anchura$altura$info_original[0], $info_original[1]);

    
//Cogido de ins_img
    
$dest $basedir.$image_name;
   
// guardar la nueva imagen 
   
ImageJPEG($imagen_final$dest100); 

   
// cerrar las imágenes 
   
ImageDestroy($original); 


    
///////////////////
   //$dest = $basedir.$image_name;
   //copy($image,$dest);
   
   
}

Podéis ver lo que sucede si subís las imágenes en
www.ebaycontraelmonstruo.es/ebaysummer/

El error que da es "Internal Server Error. The server encountered an internal error or misconfiguration and was unable to complete your request".

Repito que este mismo error no me lo da si la imagen pesa, por ejemplo, unos 100 K.

Podéis ver la info del servidor en http://www.ebaycontraelmonstruo.es/info.php
Gracias mil!!!!

Rasgon
  #2 (permalink)  
Antiguo 20/06/2006, 10:06
 
Fecha de Ingreso: febrero-2003
Ubicación: Madrid
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 0
Me voy a arrancar todos los pelos de la cabeza como no descubra qué narices pasa!
  #3 (permalink)  
Antiguo 20/06/2006, 16:00
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por rasgon
Me voy a arrancar todos los pelos de la cabeza como no descubra qué narices pasa!
El error que presentas es extremadamente genérico .. Te recomiendo ya que usas un servicio de hosting que consultes a tu proveedor .. de nada servirá que te digamos que tienes que cambiar tal o cual configuración de PHP si correspondiese .. por qué no vas a poder hacerlo tu mismo al usar un servicio de hosting.

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 21/06/2006, 03:04
 
Fecha de Ingreso: febrero-2003
Ubicación: Madrid
Mensajes: 44
Antigüedad: 21 años, 2 meses
Puntos: 0
Hola Cluster,

gracias por tu respuesta. He recibido un correo hoy de Arsys (les mandé un email explicándoles detalladamente lo que sucedía), y me han contestado que "informarle que el Dpto de sistemas nos ha confirmado que comprobado que ya se le ha aumentado el memory_limit a 16MB". No entiendo mucho de en cuanto a servidores y la memora de los procesos, pero intuyo que operaciones como imagecreatefromjpeg utilizan más memoria que otras, y, dependiendo de la imagen que manipulen, más. Ahora ya no falla con imágenes de 300 Kb, ahora falla con las que pesan más de 800Kb, pero bueno, qué se le va a hacer, al ser un servidor compartido parace que de ahí no pasan.

Espero que esto le sirva de ayuda a alguien que le pase esto.

Un saludo a todos y gracias,
Rasgon
  #5 (permalink)  
Antiguo 21/06/2006, 06:08
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por rasgon
Hola Cluster,

gracias por tu respuesta. He recibido un correo hoy de Arsys (les mandé un email explicándoles detalladamente lo que sucedía), y me han contestado que "informarle que el Dpto de sistemas nos ha confirmado que comprobado que ya se le ha aumentado el memory_limit a 16MB". No entiendo mucho de en cuanto a servidores y la memora de los procesos, pero intuyo que operaciones como imagecreatefromjpeg utilizan más memoria que otras, y, dependiendo de la imagen que manipulen, más. Ahora ya no falla con imágenes de 300 Kb, ahora falla con las que pesan más de 800Kb, pero bueno, qué se le va a hacer, al ser un servidor compartido parace que de ahí no pasan.

Espero que esto le sirva de ayuda a alguien que le pase esto.

Un saludo a todos y gracias,
Rasgon
Si, eso es cierto .. Un proceso como lo que genera GD .. mientras dura el proceso usa bastante memoria del servidor (no te puedo dar una ecuación para que lo calcules ..pero no es igual al peso de tu archivos en sí .. sobre todo cuando hablamos de un "jpg" que de por sí usa cierto algorítmo de compresión ...)

Como te decía antes .. sobre el mensaje de error extremadamente generérico .. en tu caso se te presentó ese mensaje, tu proveedor en sus "log's" del servidor ya vieron tal vez ese exceso de consumo de memoria y por ende según comentas te lo aumentaron.

Por cierto, .. para redondear el tema; "memory_limit" es una directica que se puede alterar vía php.ini sólo (en principio) .. es decir .. no se puede ajustar en tiempo de ejecución de tu script por un ini_set() o función própia de PHP.

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 21:10.