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.