Foros del Web » Programando para Internet » PHP »

Resized imagen y guardar en db

Estas en el tema de Resized imagen y guardar en db en el foro de PHP en Foros del Web. Hola amigos ayuda please, necesito subir una imagen a una base de datos pero antes desea redimencionarla... esto es lo que he echo: //envio el ...
  #1 (permalink)  
Antiguo 08/05/2006, 23:12
 
Fecha de Ingreso: julio-2003
Ubicación: Viña del mar
Mensajes: 111
Antigüedad: 21 años, 4 meses
Puntos: 0
Resized imagen y guardar en db

Hola amigos

ayuda please, necesito subir una imagen a una base de datos pero antes desea redimencionarla...

esto es lo que he echo:

//envio el gif desde un form (archivo = $_FILES['form_data']['tmp_name'])

//creo una imagen gif y averiguo sus dimensiones
$fuente = imagecreatefromgif($archivo);
$imgAncho = imagesx($fuente);
$imgAlto =imagesy($fuente);

//redimensiono a 100 de ancho por el alto proporcional
$ancho=100;
$alto=($imgAlto*$ancho/$imgAncho);
$imagen = imagecreatetruecolor($ancho,$alto);
ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$a lto,$imgAncho,$imgAlto);


// aqui es donde tengo el problema, no se leer la imagen, antes lo hacia con fopen leyendo el temporal, pero ahora no se


?????
$fp = fopen($imagen, "rb");
$data = fread($fp, $tamanio);
$data = addslashes($data);
fclose($fp);
????

$result=MYSQL_QUERY("update c_usuario set data='$data' where N_USUARIO =1 ");
  #2 (permalink)  
Antiguo 08/05/2006, 23:31
 
Fecha de Ingreso: noviembre-2004
Mensajes: 159
Antigüedad: 20 años
Puntos: 0
De acuerdo

Ok amigo aqui te pongo un ejemplo de como redimensionar una imagen



Código PHP:
 

//declaro mis constantes
  
define("ALTURA"60);
  
define("ANCHO"468);

# Nombre del archivo temporal del thumbnail
 
define("NAMETHUMB""/tmp/thumbtemp"); //Esto en servidores Linux, en 

  # Servidor de base de datos
  
define("DBHOST""localhost");
  
# nombre de la base de datos
  
define("DBNAME""nombredetubd");
  
# Usuario de base de datos
  
define("DBUSER""user");
  
# Password de base de datos
  
define("DBPASSWORD""pass");
  

// Mime types permitidos esto es un array para que valide gif, jpg, y png

  
$mimetypes = array("image/jpeg""image/pjpeg""image/gif""image/png");
  
// aqui empieza una parte interesante

 
  
$name $_FILES["foto"]["name"];
  
$type $_FILES["foto"]["type"];
  
$tmp_name $_FILES["foto"]["tmp_name"];
  
$size $_FILES["foto"]["size"];


 switch(
$type) {
    case 
$mimetypes[0]:
    case 
$mimetypes[1]:
      
$img imagecreatefromjpeg($tmp_name);
      break;
    case 
$mimetypes[2]:
      
$img imagecreatefromgif($tmp_name);
      break;
    case 
$mimetypes[3]:
      
$img imagecreatefrompng($tmp_name);
      break;
  }
  
$datos getimagesize($tmp_name);

   
$thumb imagecreatetruecolor(ANCHOALTURA);
  
imagecopyresized($thumb$img0000ANCHOALTURA$datos[0], $datos[1]);
  switch(
$type) {
    case 
$mimetypes[0]:
    case 
$mimetypes[1]:
      
imagejpeg($thumbNAMETHUMB);
      break;
    case 
$mimetypes[2]:
      
imagegif($thumbNAMETHUMB);
      break;
    case 
$mimetypes[3]:
      
imagepng($thumbNAMETHUMB);
      break;
  }
  
// Extrae los contenidos de las fotos

  # contenido de la foto original
  
$fp fopen($tmp_name"rb");
  
$tfoto fread($fpfilesize($tmp_name));
  
$tfoto addslashes($tfoto);
  
fclose($fp);
 
 
# contenido del thumbnail
  
$fp fopen(NAMETHUMB"rb");
  
$tthumb fread($fpfilesize(NAMETHUMB));
  
$tthumb addslashes($tthumb);
  
fclose($fp);
  
// Borra archivos temporales si es que existen
  
@unlink($tmp_name);
  @
unlink(NAMETHUMB); 
ok y de alli insertarias el thumbnail (o la imagen redimensionada en tu bd) y tambien la imagen original . (mediante tu sentencia sql)

Saludos

A. Acosta
  #3 (permalink)  
Antiguo 09/05/2006, 08:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Si vas almacenar tus datos en forma "binaria" en tu BBDD .. puedes usar directamente el "resource" de imagen que generas en:


$imagen = imagecreatetruecolor($ancho,$alto);
ImageCopyResized($imagen,$fuente,0,0,0,0,$ancho,$a lto,$imgAncho,$imgAlto);

No sé si te hará falta añadir unos "slashes" .. tal vez si, tendrás que probarlo:
$data = addslashes($imagen);

Y de ahí .. a tu consulta SQL de insercción o actualizar:
$result=MYSQL_QUERY("update c_usuario set data='$data' where N_USUARIO =1 ");

No es necesario que generes un archivoi en el "disco" para tomarlo (leyendolo) y luego eliminarlo .. (como propone albertt_t)

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 09/05/2006, 16:29
 
Fecha de Ingreso: julio-2003
Ubicación: Viña del mar
Mensajes: 111
Antigüedad: 21 años, 4 meses
Puntos: 0
Ok, no me ha resultado lo que dice cluster que es lo primero que habia probado, funciona si genero el archivo y luego lo leo como dice albertt_t.

Lo ideal es lo que dice cluster, pero no me funciona...

Muchas gracias

Otra cosa, una recomendación

En general guardo una imagen 4 o 5 KB en la tabla de usuarios, tengo al rededor de 60 mil usuarios, si inserto las imagenes aqui, ¿esto volveria demasiado lenta mi db (mysql)?

veo que aqui en los foros tambian se guardan las imagenes en db, seria recomendable guardarlas en otra tabla?

Gracias nuevamente
  #5 (permalink)  
Antiguo 10/05/2006, 06:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Cita:
En general guardo una imagen 4 o 5 KB en la tabla de usuarios, tengo al rededor de 60 mil usuarios, si inserto las imagenes aqui, ¿esto volveria demasiado lenta mi db (mysql)?
Pues .. multiplica y obtendras el tamaño de la tabla que Mysql tendrá que gestionar para hacer consultas SQL .. Luego vas a www.mysql.com y revisas si estás en el rango de lo que Mysql puede gestionar .. Pero como en todo tratamiento de datos .. no será lo mismo que esa cantidad de datos lo gestione un Servidor X con ciertas características que uno Y con otras (inferiores tal vez).

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 10/05/2006, 07:00
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Ok .. ok, ..

Cuando propuse almacenar el "$image" .. no caí (incluso pese que lo "dije" yo mismo) que eso es un "resource" de imagen .. es decir, un recurso "temporal" que se crea al trabajar la creación o manipulación de una imagen.

Lo que se debería hacer es "capturar" el buffer de salida de PHP originado por las típicas funciones imagePNG() .. imageJPEG() que son las que "entregan" al buffer de salida el proceso de la imagen en sí.

En consecuencia ..

Cita:
ob_start();
imagejpeg($imagen);
$data = ob_get_contents();
ob_end_clean();
Un buen tutorial al respecto:
http://www.programacion.com/php/arti...imagenesmysql/

Según indica dicho tutorial .. en lugar de un "addslashess()" (que es lo que usamos cuando leemos el "string" de imagen desde un archivo ...) hay que filtrar algunos caracteres como menciona esta porción de código:

Cita:
$data = str_replace('##','\#\#',mysql_escape_string($data) );
(en realidad es un "addslashess()" en general .. por qué mysql_escape_string() hace eso mismo también .. de hecho sería recomendable probar a usar: mysql_real_escape_string() .. )

Y luego tu consulta SQL de insección:

Cita:
$result=MYSQL_QUERY("update c_usuario set data='$data' where N_USUARIO =1 ");

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 12/05/2006, 21:39
 
Fecha de Ingreso: julio-2003
Ubicación: Viña del mar
Mensajes: 111
Antigüedad: 21 años, 4 meses
Puntos: 0
Ok

Funcionó bstante bien con ob_start() y ob_end_clean(), solo que la imagen pierde calidad.

Hay un aforma de evitar esto?
  #8 (permalink)  
Antiguo 21/07/2006, 21:28
 
Fecha de Ingreso: noviembre-2003
Ubicación: mar del plata
Mensajes: 107
Antigüedad: 21 años
Puntos: 0
imagejpeg($thumb, NAMETHUMB);

reemplazalo por esto .. (creo jaja)

imagejpeg($thumb, NAMETHUMB, "100"); //100% calidad
__________________
Ale
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 12:56.