Problema redimensionando imágenes con PHP

Whose

Buenas, quería comentar un problema que tengo, el cual me desespera ya que limita enormemente la funcionalidad de mis páginas.

Programas una galería de imágenes, un sistema de usuarios, un sistema de noticias, etc. Y para todos ellos empleas una función para redimensionar las imágenes que el usuario final va a subir a través de un formulario.
En local funciona de maravilla, en un servidor propio donde las limitaciones las pones tú también funciona de maravilla, te gastas 150€ al año en un alojamiento en 1and1 y le tienes que explicar a tu cliente que no puede subir imágenes de +1mb.

¿Hago algo mal o esto es lo habitual? El problema viene en la limitación de memoria establecida (la directiva memory_limit de PHP está en 40Mb y cuando utilizo la función imagecreatefromjpeg con una imágen superior a 1,5mb, me devuelve el siguiente error:
Fatal error: Out of memory (allocated 32768000) (tried to allocate 15552 bytes) in /homepages/26/d345732***/htdocs/funciones/redimensiona-imagen.php on line 4

El código utilizado es lo de menos ya que he probado a limitarlo a utilizar la función imagecreatefromjpeg con cualquier imágen, eliminando el resto del código que redimensionaba la imágen, y estamos en las mismas...

También he probado a aumentar la directiva memory_limit con la función ini_set, pero como era de esperar la limitación sigue en 40Mb. ¿Necesita más de 40Mb de memoria el servidor para crear una imágen de 2Mb?

Acepto cualquier sugerencía, gracias de antemano.

Tunnecino

Supongo que lo habrás probado pero... has intentado añadir en el script que genera la imagen:

ini_set('memory_limit', '40M');

MisKo

Y si te pones en contacto con 1and1 ?

Whose

sí que he probado, lo comentaba en el post principal aunque con esa parrafada no me extraña que no te hayas dado cuenta XDD

Pensando en alguna alternativa, se me ocurre que podría hacerse dicha redimensión en el lado del cliente y no en el servidor, pero no se me ocurre como hacerlo, quizás con actionscript a través de flash? no tengo ni idea de flash...

Edit: #3 es tontería, ya te dicen en el F.A.Q. que si necesitas más memoria contrates un servidor dedicado
http://faq.1and1.com/scripting_languages_supported/php/9.html

Por cierto, a nadie más le ha ocurrido esto con servidores de pago? Y en caso afirmativo ¿Qué solución han buscado?

MisKo

Solo por casualidad, dime los pasos, asi a lo tonto, que haces, es decir

Le muestro a la persona un formulario web
La persona elije una imagen
La sube al serv..

etc.. etc..

EDIT: por lo que leo por inet, tambien puede ser una mala optimizacion de codigo, ponlo si quieres y le hecho un ojo tambien ;)

Otro edit mas:
Leyendo aqui: http://php.net/manual/es/function.imagecreatefromjpeg.php te dan una formula para calcular lo que te va a costar cargar la imagen en memoria.

Formula
Whose

Pensaba que era una mala optimización del código así que suprimí todos los pasos (pasar imagen desde el formulario y redimensionarla), dejé tan solo la función imagecreatefromjpeg pasándole como parámetro una imágen que tenía alojada en el servidor y seguía con lo mismo.

Ej: (la imágen pesa 3,8MB)
<?php
imagecreatefromjpeg('uploads/galeria/_MG_3150.jpg');
?>

Fatal error: Out of memory (allocated 34865152) (tried to allocate 15552 bytes) in /homepages/26/d345732***/htdocs/prueba.php on line 2

si pruebo con echo ini_get('memory_limit'); me dice que hay 128M

Edit:
Probando este código para ver los límites reales de memoria
http://pastebin.com/iT9gddjj

este es el resultado:
Expected memory limit 64MB
Base -> 56876 (0.05 MB)
&#8194;
Clear -> 67040 (0.06 MB)
1000 x 10000 chars -> 10067124 (9.6 MB) [15 percent]
Clear -> 67148 (0.06 MB)
1500 x 10000 chars -> 15067232 (14.37 MB) [22.5 percent]
Clear -> 67148 (0.06 MB)
2000 x 10000 chars -> 20067232 (19.14 MB) [29.9 percent]
Clear -> 67148 (0.06 MB)
2500 x 10000 chars -> 25067232 (23.91 MB) [37.4 percent]
Clear -> 67148 (0.06 MB)
3000 x 10000 chars -> 30067232 (28.67 MB) [44.8 percent]
Clear -> 67148 (0.06 MB)
3500 x 10000 chars -> 35067232 (33.44 MB) [52.3 percent]
Clear -> 67148 (0.06 MB)
4000 x 10000 chars ->
Fatal error: Out of memory (allocated 262144) (tried to allocate 40000001 bytes) in /homepages/26/d345732***/htdocs/prueba.php on line 19

Tunnecino

Sobre lo que dices de los dedicados en 1and1... no te aconsejo pillarte uno si vas a gestionarlo por tu cuenta (es decir, si vas a ser tu propio sysadmin) por que no te dan soporte alguno.

NeB1

#6 algo raro pasa ahí, 128 megas de memoria no te los gastas ni de coña. Siempre que he tenido problemas de Out of memory, las causas eran de lo más dispares, y nunca relacionadas realmente con la memoria...

Joder, ahora no recuerdo porque me pasaba la última vez...

Whose

Nada de 128, unos 30mb por lo que refleja eso...

MisKo

Tienes por ahi la imagen, para verla?

Estoy mirando por ahi, y el problema principal, para que te hagas a la idea, es una diferencia que se puede apreciar en los BMPs y los JPGs.

Los BMPs suele ser la imagen sin comprimir, y los jpgs comprimidas, y el comando que tu le pones, te descomprime la imagen, el jpg, en el servidor.

Esto quiere decir que, un JPG de 3,5 mb me parece a mi una resolucion que se pasa de lo norma, y totalmente inapreciable en un monitor ( se pasa de grande seguro ), y que descomprimido, debe de ocupar los 50mb, asi que, seguramente tocara subir archivos mas pequeños.

Asi que, si manejas fotos tan grandes, supongo que es por que , a la persona final, le interesará bajarlos en su ordenador y verlo en todo detalle, por lo que la unica solucion que se me ocurre es.

Foto en buenisima calidad -> .zip en el servidor para descargar
Foto a 1/4 de calidad -> Foto para ver en el monitor
Thumbnail -> Para la galerias de fotos, vista en miniatura

Whose

La he subido a rapidshare ya que si la subo a imageshack u otro sitio puede redimensionarla o quitarle cualquier información :/
http://rapidshare.com/files/428219378/_MG_3150.jpg

MisKo

Lo dicho, viendo la foto, escapa a cualquier monitor actual, con esa resolucion de 3888x2592 es lo q te e dixo yo.

Esa misma foto, la he guardado en BMP y me ocupaba unos 28.8mb ( sigue sin ser 30mb, pero seguro que la original, sin el paint, descomprimida, ocupa mucho mas.. )

Whose

El tema es que sobre todo en la galería de imágenes el cliente sube fotos diréctamente sacadas de la cámara, y normalmente pesan entre 3 y 4 Mb. Yo el proceso que hago es redimensionar esa imágen para que acabe pesando unos 300kb y la resolución a unos 800x600 por poner un ejemplo.

Y en la función que utilizo para redimensionar la imágen empleo la función imagecreatefromjpeg imagecopyresampled (también probé con imagecopyresized que es menos pesada) ¿Se te ocurre otro modo de hacerlo que resulte mas liviano para el servidor?

MisKo

Opcion 1: Que configure la camara para que le use menos megapixeles
Opcion 2: Que las cambie el en local ( hay programas para cambiar todas las fotos de golpe a una resolucion, y que luego te las ponga en una carpeta, sin que te modifique el original.

Opcion 3: Dimensionar la imagen en el lado del cliente mediante un applet de java o parecido, Te he encontrado esto por inet, pruebalo a ver si te funciona ;)http://www.shift8creative.com/projects/agile-uploader/index.html#

Te dejo esta tambien, que tiene buena pinta : http://www.resize-before-upload.com/demos/essentials/ ( Tiene una version gratuita )

EDITO: Segun veo, todos ellos lo hacen con flash, por si quieres ver algo, igual hacer esto no se tarda mucho en flash, pero vamos, yo no manejo de flash, lo siento xD

Whose

Vaya, la verdad es que tiene muy buena pinta, mañana lo probaré con calma y os cuento.
Gracias!

erdanblo

¿Qué tal la opción de subirlas en tu dedicado, redimensionarlas, y enviar al hosting de 1and1 la copia ya tratada?

NeB1

#15 también puedes subir la foto, llamar a un programa en el background que te redimensione la imagen con

exec("./programaQueRedimensiona photo.jpg");

#9 si pruebo con echo ini_get('memory_limit') ; me dice que hay 128M era lo único que ponía cuando le conteste, el resto es un edit.

MisKo

Si pudiera correr programas en el background de un servidor 1and1, podria cambiarse la directiva memory limit...

PiradoIV

¿A lo mejor con ImageMagick?, también está para la linea de comandos por si puedes ejecutar comandos:

· Generate Thumbnails in General

eXtreM3

Has probado a subir un .htaccess con estos comandos?

#tamaño de archivo
php_value upload_max_filesize 8M
php_value post_max_size 8M
#tiempo de ejecucion
php_value max_execution_time 200

Whose

Al final me decidí por Agile uploader, tuve algunos problemas para implementarlo ya que algunos parámetros de la documentación no me funcionaban (la versión de jQuery), pero modificando directamente la librería, lo tuve funcionando a mi gusto.

#19 ya estuve leyendo sobre ImageMagick pero 1and1 no tiene dicha librería, o al menos no sale reflejado con un phpinfo()

#20 al intentar modificar las directivas de PHP a través de htaccess, el servidor me devolvía un error, no recuerdo cual ahora mismo, pero debe estar limitado.

Lo dicho, con Agile Uploader problema solucionado, muchas gracias a todos!

1 mes después
I

Hola buenas noches soy nuevo aquí, he estado leyendo y quiero lo primero daros la enhorabuena por el buen trabajo que hacéis a gente como yo que estamos aprendiendo cada día un poco más de este mundo.

Whose te quería pedir ayuda, me he descargado el Agile uploader pero no consigo configurarlo, me gustaría saber como puedo contactar contigo para ver si me puedes echar una mano para saber que es lo que cambiaste para configuarlo correctamente o comentas aquí que es lo que tenemos que cambiar para que funcione.

muchas gracias de antemano. saludos

Usuarios habituales