Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] girar imagen con los datos exif

Estas en el tema de girar imagen con los datos exif en el foro de PHP en Foros del Web. estoy intentando girar y subir una imagen al servidor dependiendo de sus datos exif mediante este código @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $tmp_name = ...
  #1 (permalink)  
Antiguo 20/05/2014, 07:24
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
girar imagen con los datos exif

estoy intentando girar y subir una imagen al servidor dependiendo de sus datos exif mediante este código


Código PHP:
Ver original
  1. $tmp_name=$_FILES['image']['tmp_name'];      
  2.                                             $img_file=$_FILES['image']['name'];                      
  3.                                             $img_type=$_FILES['image']['type'];
  4.                                             $foto="../img/albumes/".$img_file;
  5.                                             if ((strpos($img_type,"jpeg") || strpos($img_type,"jpg"))){
  6.                                                 $exif = exif_read_data($_FILES['image']['tmp_name']);
  7.                                                 if(!empty($exif['Orientation'])) {
  8.                                                     switch($exif['Orientation']) {
  9.                                                         case 8:
  10.                                                             $image = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name']));
  11.                                                             $tmp_name = imagerotate($image,90,0);
  12.                                                             move_uploaded_file($tmp_name, "../img/albumes/".$img_file);  
  13.                                                             break;
  14.                                                         case 3:
  15.                                                             $image = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name']));
  16.                                                             $tmp_name = imagerotate($image,180,0);
  17.                                                             move_uploaded_file($tmp_name, "../img/albumes/".$img_file);
  18.                                                             break;
  19.                                                         case 6:
  20.                                                             $image = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name']));
  21.                                                             $tmp_name = imagerotate($image,-90,0);
  22.                                                             move_uploaded_file($tmp_name, "../img/albumes/".$img_file);
  23.                                                             break;
  24.                                                     }
  25.                                                 }
  26.                                                              
  27.                                             }

obviando lo optimo que es, de momento lo estoy probando y me salta el siguiente error

Código:
Warning: move_uploaded_file() expects parameter 1 to be string, resource given in...
aguna idea?
  #2 (permalink)  
Antiguo 20/05/2014, 07:29
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Es bastante obvio tu problema: te esta pidiendo el nombre del archivo y tu le estas entregando un "resource", observa este codigo:

Cita:
<?php
// Archivo y rotación
$nombre_archivo = 'prueba.jpg';
$grados = 180;

// Tipo de contenido
header('Content-type: image/jpeg');

// Cargar
$origen = imagecreatefromjpeg($nombre_archivo);

// Rotar
$rotar = imagerotate($origen, $grados, 0);

// Imprimir
imagejpeg($rotar);

// Liberar la memoria
imagedestroy($origen);
imagedestroy($rotar);
?>
Es un ejemplo sacado de PHP.net pero para que veas la secuencia.....
__________________
Salu2!
  #3 (permalink)  
Antiguo 20/05/2014, 07:51
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

se supone que el archivo se lo paso aquí, no? para algo es la imagen que le paso en el imput

Código PHP:
Ver original
  1. $tmp_name=$_FILES['image']['tmp_name'];

si me baso en ese ejemplo o me suelta un churro de símbolos al imprimirlo (imagejpeg($rotar);) o me saca una imagen que corresponde a un index.php (header('Content-type: image/jpeg');)
  #4 (permalink)  
Antiguo 20/05/2014, 09:01
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Pues estas sobre-escribiendo eso que muestras con un recurso al hacer:

Código PHP:
Ver original
  1. $tmp_name = imagerotate($image,90,0);

Asi que no le pasas nigun nombre de archivo sino el recurso que te devuelve imagerotate()
__________________
Salu2!
  #5 (permalink)  
Antiguo 20/05/2014, 13:32
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

debo ser gilipollas porque no hay manera de arreglarlo con lo que me dices, siempre me pasa el mismo error
  #6 (permalink)  
Antiguo 20/05/2014, 13:47
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

No te des tan duro...... pero disculpa sino me pongo a ver todo el codigo, lo que si te voy a ayudar aconsejandote no andar copiando las variables "de gusto", tu puedes acceder directamente y te evitas estos errores:

Código PHP:
Ver original
  1. // no tiene sentido hacer esto:
  2.  
  3. $tmp_name=$_FILES['image']['tmp_name'];      
  4. $img_file=$_FILES['image']['name'];                      
  5. $img_type=$_FILES['image']['type'];
__________________
Salu2!
  #7 (permalink)  
Antiguo 20/05/2014, 14:10
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

Cita:
Iniciado por Italico76 Ver Mensaje
No te des tan duro...... pero disculpa sino me pongo a ver todo el codigo, lo que si te voy a ayudar aconsejandote no andar copiando las variables "de gusto", tu puedes acceder directamente y te evitas estos errores:

Código PHP:
Ver original
  1. // no tiene sentido hacer esto:
  2.  
  3. $tmp_name=$_FILES['image']['tmp_name'];      
  4. $img_file=$_FILES['image']['name'];                      
  5. $img_type=$_FILES['image']['type'];
porque no? luego hago comprobaciones o subo los archivos con eso de manera más cómoda :/
  #8 (permalink)  
Antiguo 20/05/2014, 14:32
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Prueba algo asi:

Código PHP:
Ver original
  1. case 8:
  2.                                                              
  3.     $image_r = imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name']));
  4.     $rotatada_r = imagerotate($image_r,90,0);
  5.     imagejpeg($rotatada_r);                                                        
  6.     imagedestroy($image_r);
  7.     move_uploaded_file($_FILES['image']['tmp_name'], "../img/albumes/".$_FILES['image']['name']);  
  8.     break;

Los _r significa que son "recursos"
__________________
Salu2!
  #9 (permalink)  
Antiguo 20/05/2014, 14:40
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

me ocurre esto con lo que me has pasado, antes ya me pasaba mientras hacia pruebas esta tarde



Y por supuesto, la foto se sube igual que antes... :/
  #10 (permalink)  
Antiguo 20/05/2014, 15:19
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Te pasa con todas las imagenes ? prueba con otras ?

Yo no le tengo confianza a $_FILES['image']['type'] eso es la extension.. que puede estar errada, deberias verificar el FORMATO:

Código PHP:
Ver original
  1. $img_type = pathinfo($_FILES['image']['type']);

Haciendo ese cambio.. prueba asi:

Código PHP:
Ver original
  1. // no mas str_pos(...)
  2. if ($img_type=='jpeg'){
  3.    // ...
  4. }

Ojo haz un var_dump($img_type) porque no se si lo devuelve como 'jpeg' o 'jpg'
__________________
Salu2!
  #11 (permalink)  
Antiguo 20/05/2014, 23:59
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

me pasa con todas las que pesan moderadamente, si es una de una camara reflex (algo más pesada) directamente se pasa de memoria cuando antes ni ocurria... supongo que es por los caracteres que pinta...

he probado a quitarle las extensiones y también ocurre

todo eso lo saca por esto
Código PHP:
Ver original
  1. imagejpeg($rotatada_r)
  #12 (permalink)  
Antiguo 21/05/2014, 04:59
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Bueno.... si hay imagenes que rota correctamente el codigo esta correcto asi que delante de ese script coloca esto:

Cita:
ini_set('memory_limit',1024);
Al menos en TU maquina deberia funcionar.....y si llega a ser asi... debes descubrir cuanto es la memoria minima que necesitas para esto porque siempre la vas a necesitar
__________________
Salu2!
  #13 (permalink)  
Antiguo 21/05/2014, 05:09
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

no no, no gira las imágenes, me saca toooooodo ese chorro pero la sube igual que antes
  #14 (permalink)  
Antiguo 21/05/2014, 05:34
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Si pruebas rotar imagenes no subidas sino de una ubicacion predeterminada con un nombre de archivo tambien conocido .... te pasa lo mismo ?


Si sigue fallando.. y hablo con ejemplos copy & paste de PHP.net, ya te tocaria re-instalar la libreria GD o.. mas facil... prueba con otra version de PHP
__________________
Salu2!
  #15 (permalink)  
Antiguo 21/05/2014, 06:42
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

si, me saca el chorraco con símbolos y letras pero no gira nada
  #16 (permalink)  
Antiguo 21/05/2014, 07:09
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

he conseguido quitar todo el chorro de símbolos, pongo uno de los casos

Código PHP:
Ver original
  1. $image_r=imagecreatefromstring(file_get_contents($_FILES['image']['tmp_name']));
  2. $rotatada_r=imagerotate($image_r,90,0);
  3. imagejpeg($rotatada_r, $_FILES['image']['name']);
  4. imagesdestroy($image_r);
  5. move_upload_file(...);
  6. break;

El cambio es en el imagejpeg que le he añadido el filname... pero sigue sin funcionar, pasa el error de los símbolos pero no gira nada
  #17 (permalink)  
Antiguo 21/05/2014, 07:38
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

La verdad no me interesa manejar imagenes... pero hice una prueba local (archivo local, ruta local) y me funciono PERFECTO!

Código PHP:
Ver original
  1. <?php
  2.  
  3. $image_r=imagecreatefromstring(file_get_contents('../js/images/lentejas.jpg'));
  4. $rotatada_r=imagerotate($image_r,90,0);
  5. $rotada = imagejpeg($rotatada_r);
  6. imagedestroy($image_r);
  7.  
  8. $out = ob_get_contents();
  9. file_put_contents('salida.jpg',$out);
  10.  
  11. echo "Rotada!";

Pensando sobre que querias decir con "todo el chorro de símbolos" .. ahora te entendí : eso que veias era el archivo generado devuelto por pantalla pero no como imagen sino como secuencia de bytes y si tal como estaba tu codigo, al comienzo del script (sin hacer ningun echo / print ni nada similar) hacias:

Código PHP:
Ver original
  1. <?php
  2. header('Content-Type: image/jpeg');

... hubieras visto la imagen rotada en pantalla
__________________
Salu2!

Última edición por Italico76; 21/05/2014 a las 08:01
  #18 (permalink)  
Antiguo 21/05/2014, 08:02
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

Cita:
Iniciado por Italico76 Ver Mensaje
La verdad no me interesa manejar imagenes... pero hice una prueba local (archivo local, ruta local) y me funciono PERFECTO!

Código PHP:
Ver original
  1. <?php
  2.  
  3. $image_r=imagecreatefromstring(file_get_contents('../js/images/lentejas.jpg'));
  4. $rotatada_r=imagerotate($image_r,90,0);
  5. $rotada = imagejpeg($rotatada_r);
  6. imagedestroy($image_r);
  7.  
  8. $out = ob_get_contents();
  9. file_put_contents('salida.jpg',$out);
  10.  
  11. echo "Rotada!";

Pensando sobre que querias decir con "todo el chorro de símbolos" .. ahora te entendí : eso que veias era el archivo generado devuelto por pantalla pero no como imagen sino como secuencia de bytes y si tal como estaba tu codigo, al comienzo del script (sin hacer ningun echo / print ni nada similar) hacias:

Código PHP:
Ver original
  1. <?php
  2. header('Content-Type: image/jpeg');

... hubieras visto la imagen rotada en pantalla
con este ejemplo si que lo gira! he probado con una foto en un iPhone y las gira a la perfección... luego haré más pruebas para cercionarme completamente...

MUCHISIMAS GRACIAS
  #19 (permalink)  
Antiguo 21/05/2014, 08:25
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 7 meses
Puntos: 292
Respuesta: girar imagen con los datos exif

Si lo haces asi... ob_start(); debe estar en un solo lugar, al comienzo del script y por favor no hagas echos ni print ni nada que pueda sacar algo por pantalla hasta el ob_end_clean();
__________________
Salu2!
  #20 (permalink)  
Antiguo 21/05/2014, 08:29
 
Fecha de Ingreso: mayo-2011
Ubicación: Entre Navarra y Aragón
Mensajes: 96
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: girar imagen con los datos exif

lo he hecho tal cual me has puesto, y ya te digo que funciona en principio, ahora estoy con otra cosa y hasta la noche no podré comprobarlo con seguridad, pero esta pié y medio hecho :)

Etiquetas: exif, girar
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 09:25.