Foros del Web » Programando para Internet » PHP »

Necesito ayuda para OPTIMIZAR una funcion

Estas en el tema de Necesito ayuda para OPTIMIZAR una funcion en el foro de PHP en Foros del Web. Voy a explicar el objetivo: Es sencillo, permitir a usuarios que suban sus fotos a un servidor. Fotos que despues podran ser visualizadas, TODAS con ...
  #1 (permalink)  
Antiguo 01/03/2006, 05:11
Avatar de kazafun  
Fecha de Ingreso: diciembre-2003
Ubicación: Elda
Mensajes: 843
Antigüedad: 20 años, 10 meses
Puntos: 13
Necesito ayuda para OPTIMIZAR una funcion

Voy a explicar el objetivo:

Es sencillo, permitir a usuarios que suban sus fotos a un servidor. Fotos que despues podran ser visualizadas, TODAS con una mismo tamaño, digamos 400x400 pixeles, para homogeneizar la web.

Aparentemente sencillo, el problema viene cuando el usuario sube una imagen muy grande (ojo! no en peso sino en PIXELES).

Un usuario NORMAL y corriente no sabe reducir el tamaño de una foto, por lo que esta REDUCCION la tengo que hacer con una funcion PHP. AQUI LLEGA EL PROBLEMA, EL GRAN PROBLEMA!!!!!

No encuentro NINGUNA empresa de hosting en la que mi script funcione con imagenes de mas de 1300x1300 pixeles ( a todas horas insuficiente!!!!!), lo maximo que me ofrecen como memoria de ejecucion es 16 MB...



NECESITO AYUDA POR FAVOR!!!

Ahi va, por si quereis probarlo el codigo muy resumido que utilizo, tanto para enviar la imagen, como para recibirla y manejarla ( la idea es manejarla SOLO UNA VEZ, coger la imagen de por ejemplo 2500x2500 pixeles guardarla pasarla a una funcion en el servidor, reducir el tamaño a 400x400 pixeles, guardar esa imagen y borrar la original de 2500x2500 pixeles), para probarlo solo habria que crear ademas una carpeta llamada "fot" en la que se guardarian las imagenes reducidas.

codigo html para enviar la imagen (prueba.html):
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html lang="es">
<body>


<form name='form1' method='post' action='add.php' enctype='multipart/form-data'>
<b>Añadiendo una oferta...</b><br>
Añada foto si lo desea:  (Solo en formato jpg, gif, o png y de menos de 1 MB)<br>
<input name=fot1 type=file class=caja1> <br>
<input type=submit value='ENVIAR'>
<input type=hidden name='MAX_FILE_SIZE' value=1048576>
</form>
</body>
</html>

Y lo mas IMPORTANTE y que me esta suponiendo un calvario, codigo PHP que MANEJA LA FOTO y peta la memoria cuando me la limitan en el servidor a 16 MB.

add.php:
Código:
<?php


//datos del arhivo 

$foto1_nombre = $HTTP_POST_FILES['fot1']['name']; 
$foto1_tipo = $HTTP_POST_FILES['fot1']['type']; 
$foto1_tamano = $HTTP_POST_FILES['fot1']['size']; 



//----------------------------funcion que reduce el tamaño de la imagen

function im($imagen,$anchura, $altura, $path) 
{


//creo la imagen segun la extension

$ext = substr($imagen, -3); //get extension


//aqui es cuando si la imagen es de gran tamaño (pixeles) peta poca memoria 
//que conceden las empresas, 

    if(strtolower($ext) == "gif") {
        if (!$img  = imagecreatefromgif($imagen)) {
            echo "Error opening $imagen!"; exit;
        }
    } else if(strtolower($ext) == "jpg") {
        if (!$img  = imagecreatefromjpeg($imagen)) {
            echo "Error opening $imagen!"; exit;
        }
    } else if(strtolower($ext) == "png") {
        if (!$img  = imagecreatefrompng($imagen)) {
            echo "Error opening $imagen!"; exit;
        }
    } else {
        die;
    }



 $h = $altura;
 $w = $anchura;


$size = getimagesize($imagen);


//Create new image using desired values
  $imagen_nueva = imagecreatetruecolor($w, $h);
//Set white background
  $white = imagecolorallocate($imagen_nueva, 186, 188, 213);
  imagefill($imagen_nueva, 0, 0, $white);



$imgAncho = imagesx($img); 
$imgAlto =imagesy($img); 


// ajusto el tamaño segun sea la foto mas ancha o mas larga
if($imgAlto < $imgAncho) 
	{
            
            //Setup image height
            $newh = $size[1]/($size[0]/$w);
            
            //Setup $y
            $y = ($h-$newh)/2;
            
		

            //Resize image
            imagecopyresampled($imagen_nueva, $img, 0, $y, 0, 0, $w, $newh, $size[0], 
$size[1]);
	
         } 
  else 
	{
        
            //Setup image width
            $neww = $size[0]/($size[1]/$h);
            
            //Setup $x
            $x = ($w-$neww)/2;

            //Resize image
            imagecopyresampled($imagen_nueva, $img, $x, 0, 0, 0, $neww, $h, $size[0], 
$size[1]);
                    
        }



if ($ext=="jpg") imagejpeg($imagen_nueva,$path);
if ($ext=="gif") imagegif($imagen_nueva,$path);
if ($ext=="png") imagepng($imagen_nueva,$path);

}

//-------------------------------------------------------------------------


if ($HTTP_POST_FILES['fot1']['name']!='') 
	{
	if (!((strpos($foto1_tipo, "gif") || strpos($foto1_tipo, "jpeg") || strpos($foto1_tipo, "png")) && ($foto1_tamano < 1048576))) 		{ 
    		$err1 = "La extensión o el tamaño del archivo 1 no es correcta."; 
		$err11 = "Se permiten archivos .gif .jpg o .png y de 1 Mb máximo."; 
		}
	else
		{
		
		$destino1 = "fot/" . $foto1_nombre;
		$cambiado1 = "fot/" . "prueba" . $foto1_nombre;



		$ancho=400;
		$alto=400;




    		if (move_uploaded_file($HTTP_POST_FILES['fot1']['tmp_name'], $destino1))
			{ 
       			$msg1 = "La primera foto ha sido cargada correctamente. ";

			im($destino1, $ancho, $alto, $cambiado1);


			//me cargo la foto original (la enorme de varios Mb [o no]) que siempre existe
			@unlink($destino1);
			 
    			}
		else
			{ 
       			$msg1 = "Ocurrió algún error al subir la primera foto. No pudo guardarse."; 
    			} 
 
		}
	
	}




?> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 

<html lang="es">



<body>
		<?php

		echo ("<br><div align=center>");
		if ($err1) echo ($err1 . "<br>" . $err11 . "<br>");
		
		echo ("<br>");
		echo ($msg1);
		
		echo ("<br> <a href='prueba.html'>Volver</a>");
		echo ("</div>");
		?>

</body>
</html>


¿Veis algo mal en la funcion? ¿Se podria mejorar para gastar menos recursos de memoria? Como esto creo que es muy complicado...

¿Que me recomendais? No creo tener presupuesto nisiquiera para un servidor virtual, y ya digo que ninguna empresa ofrece mas de 16 MB de memoria de ejecucion.

¿Como os planteariais este problema de tener que manejar imagenes de muchos pixeles?



Cualquier ayuda la agradeceria en el alma, MUCHISIMAS GRACIAS.
__________________
MUERTE a Internet Explorer


Mi portfolio de diseño web en Elda
  #2 (permalink)  
Antiguo 02/03/2006, 04:58
Avatar de kazafun  
Fecha de Ingreso: diciembre-2003
Ubicación: Elda
Mensajes: 843
Antigüedad: 20 años, 10 meses
Puntos: 13
Perdonad que lo suba, ¿nadie me puede orientar?
__________________
MUERTE a Internet Explorer


Mi portfolio de diseño web en Elda
  #3 (permalink)  
Antiguo 02/03/2006, 09:24
Avatar de Datacenter1
Usuario no validado
 
Fecha de Ingreso: agosto-2005
Ubicación: Chicago
Mensajes: 1.982
Antigüedad: 19 años, 3 meses
Puntos: 144
Si hicieras una modificación para que haga el proceso en 2 o 3 pasos?

Algo como si la imagen es mayor de x pixels le llevas a un tamaño menor y la guardas en un directorio temporal luego la vuelves a procesar hasta llegar al tamaño que deseas

Es solo una idea, espero que te sirva
  #4 (permalink)  
Antiguo 02/03/2006, 12:28
Avatar de kazafun  
Fecha de Ingreso: diciembre-2003
Ubicación: Elda
Mensajes: 843
Antigüedad: 20 años, 10 meses
Puntos: 13
Cita:
Iniciado por Datacenter1
Si hicieras una modificación para que haga el proceso en 2 o 3 pasos?

Algo como si la imagen es mayor de x pixels le llevas a un tamaño menor y la guardas en un directorio temporal luego la vuelves a procesar hasta llegar al tamaño que deseas

Es solo una idea, espero que te sirva

Gracias, es buena idea, el problema es que el maximo uso de memoria ocurre cuando imagecreatejpeg() hace uso de la original, realmente peta la memoria antes de reducirla aunque sea solo un poquito.

Cuando se hace un imagecreatejpeg() de una imagen de 3000x3000 px da igual si la reduces mucho o poco.
__________________
MUERTE a Internet Explorer


Mi portfolio de diseño web en Elda
  #5 (permalink)  
Antiguo 23/12/2007, 10:20
 
Fecha de Ingreso: agosto-2007
Mensajes: 37
Antigüedad: 17 años, 3 meses
Puntos: 0
Re: Necesito ayuda para OPTIMIZAR una funcion

Hola,

he probado tu codigo y ho produce errores, pero no me sube la imagen al servidor. Mi compruebo por FTP y la imagen no está ... He creado el directorio fot

¿es este el error que te daba a ti?
  #6 (permalink)  
Antiguo 23/12/2007, 19:30
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 11 meses
Puntos: 2
Re: Necesito ayuda para OPTIMIZAR una funcion

Hola Kazafun,

Realmente no hay una forma de optimizar el código. Como bien dices, el problema está simplemente en el código de imgcreate que requiere más de la memoria que tienes para cargar la imagen.

La solución que se me ocurre es que o coloques un máximo en el tamaño (KB) bastante restrictivo para que ni a muy baja calidad te puedan colocar esas fotos (no muy de mi agrado) o que simplemente pases la lógica del resize al lado del cliente utilizando para ello alguna aplicación JAVA.
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:12.