Foros del Web » Programando para Internet » PHP »

procesar imagenes al momento de subirlas

Estas en el tema de procesar imagenes al momento de subirlas en el foro de PHP en Foros del Web. Hola a todos, mucho se ha escrito del tema, pero nada que me de luz sobre esta particularidad. Quiero subir una imagen y que antes ...
  #1 (permalink)  
Antiguo 19/02/2004, 00:23
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 14 años, 7 meses
Puntos: 9
procesar imagenes al momento de subirlas

Hola a todos, mucho se ha escrito del tema, pero nada que me de luz sobre esta particularidad.

Quiero subir una imagen y que antes de que la inserte en la base de datos mySQL le ajuste el tamaño y le aplique una marca de agua (watermark) desde un png transparente.

Gracias a los temas que hay en este foro ya logré ambas cosas, pero por separado y "al vuelo" es decir, las imágenes se guardan tal como están y a la salida se procesan.

Es importante que sea al momento de hacer el upload, porque el cliente se encargará de actualizar el sitio y no tiene ni idea de cómo usar Word (no se diga Photoshop)

Bueno, si alguien conoce algún link o algo así, se agradecería.

De antemano mil gracias, son lo máximo.
  #2 (permalink)  
Antiguo 19/02/2004, 07:03
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues .. la diferncia entre crear una imagen (con las funciones de la libreria GD) "al vuelo" y al "disco" es el 2º o 3er parámetro de cada función de la familia imagecreate(), imageJPG() .. imagePNG() .. etc ...

A todo esto NO se usan las cabeceras HTTP que indican al "navegador" que el dato que genera tu rutina y esas funciones entregan al buffer de salida de PHP són del tal tipo .. Es decir .. no se usan los header("content-type" ..) y otros header() para ese propósito que puedas tener.

Y si dices que guardas en tu BD esa imagen en formato binario (no referencia > link) ... aplica tu proceso como ya lo haces para la versión "al vuelo" .. pero como ya comenté no uses los header() (quitalos) ..

No recuerdo si con la típica variable $im ($im=create_image(......) que se usa para todo imagecreate() .. o imageJPG() etc...) será suficiente para guardarlo en tu BD .. pero si eso no resultase, gestionando el buffer de salida de PHP también se podría hacer..

Código PHP:
<?
ob_start
();
// tu actual rutina ... sin el header() ...

$imagen=ob_get_contents();
ob_end_clean();

// $imagen ya lo puedes ingresar a tu BD (INSERT/UPDATE en el campo que corresponda ..)
// No sé si hará falta aplicar algún addslashes() .. pruebalo.
?>
Pero, recuerda que si lo que necesitas es guardar esa imagen procesada desde PHP al "disco" .. usa el 2º o 3er parámetro de esas funciones que ya lo hacen directamente.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 19/02/2004, 10:49
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 14 años, 7 meses
Puntos: 9
Excelente Cluster, voy a probar con el 2º parámetro de imagejpeg() a ver si lo consigo.

Sino, tendré qué investigar por eso de ob_start() y el ob_get_content()

Entiendo que lo que hace es ingresar a la variable $imagen el binario devuelto por ob_get_content(), pero en php.net habla de un parámetro "void" que ni idea de qué sea, jeje!! Ya aprenderé.

Gracias por todo. Salu2!
  #4 (permalink)  
Antiguo 19/02/2004, 11:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
void es justamente que esa función no tiene parámetros .. se llama tal cual .. funcion() .. pero para explicar que no tiene parámetros en ingles usan el termino "void" ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 20/02/2004, 20:59
Avatar de Escoffie  
Fecha de Ingreso: abril-2003
Ubicación: Mérida, Yucatán
Mensajes: 242
Antigüedad: 14 años, 7 meses
Puntos: 9
Hola a todos, la respuesta que me dio Cluster funcionó muy bien

Con la ayuda de muchos códigos de las FAQ y de otros temas aquí tocados (gracias a todos)arme un código que hace lo que yo quería.

Aquí les dejo un código que mete la imagen a tamaño de 350 dpi de ancho además de un thumbnail de 200, y en ambos casos les inserta una marca de agua.

Inserta los archivos como jpg al 60 y 40% de calidad respectivamente

¡Es una maravilla PHP y GD!

Ahí si le ven un modo de simplificarlo o mejorarlo, adelante
Porque yo lo escribí seguro pasándome por el arco del triunfo todas las buenas maneras

Código PHP:
<?php 
require_once('te_conectas.php'); 
//establece una conexión con la base de datos.
mysql_select_db($midb$conexion); 
//selecciona la DB correspondiente
//Si no se ha subido nada, te rebota de nuevo al formulario de inserción:
if (empty($_FILES['archivo']['name'])){
header("location: mi_subir.php?status=falta%20indicar%20fichero"); //o como se llame el formulario ..
exit;
}

$name=$_FILES['archivo']['name'];
$type=$_FILES['archivo']['type'];
$thumb_name 'tn_'.$name;
$thumb_name2 'tn2_'.$name;

// archivo temporal (ruta y nombre).
        
$temp=$_FILES['archivo']['tmp_name']; 
//Imagen original en el servidor
        
$img = @imagecreatefromjpeg($temp) or die("No se encuentra la imagen $camino$nombre<br>\n"); //Objeto con el que trabajará el programa
        
imagealphablending($imgtrue); //Para que acepte la transparencia del PNG
        
$logo imagecreatefrompng("watermark.png"); //El logo que se va a pegar encima
        
$logo2 imagecreatefrompng("watermark2.png"); //El logo que se va a pegar encima
        
$margen 10//distancia entre el watermark y la orilla
        
$margen2 5//distancia entre el watermark y la orilla
        
$logoW =imagesx($logo); //Anchura del logo
        
$logoH =imagesy($logo); //Altura del logo
        
$logoW2 =imagesx($logo2); //Anchura del logo
        
$logoH2 =imagesy($logo2); //Altura del logo
        
$dimensiones getimagesize($temp); //Dimensiones originales de la imagen
        
$anchura 400//Tamaño al que quiero que quede
        
$ratio = ($dimensiones[0] / $anchura);
        
$altura round($dimensiones[1] / $ratio);
        
$anchura2 200//Tamaño al que quiero que quede
        
$ratio2 = ($dimensiones[0] / $anchura2);
        
$altura2 round($dimensiones[1] / $ratio2);
        
$thumb imagecreatetruecolor($anchura,$altura); //crea la nueva imagen
        
$thumb2 imagecreatetruecolor($anchura2,$altura2); //crea la nueva imagen
        
imagecopyresampled ($thumb$img0000$anchura$altura$dimensiones[0], $dimensiones[1]);//reescala
        
imagecopyresampled ($thumb2$img0000$anchura2$altura2$dimensiones[0], $dimensiones[1]);//reescala
        
imagecopy($thumb$logo$anchura-$logoW-$margen$altura-$logoH-$margen00$logoW$logoH); //Pone el logo
        
imagecopy($thumb2$logo2$anchura2-$logoW2-$margen2$altura2-$logoH2-$margen200$logoW2$logoH2); //Pone el logo
        
imagejpeg($thumb,$thumb_name60);//mueve la imagen al server
        
imagejpeg($thumb2,$thumb_name240);//mueve la imagen al server
        
imagedestroy($logo); //destruye el logo después de usarlo
        
imagedestroy($thumb); //destruye el thumb
        
imagedestroy($thumb2); //destruye el thumb
        
imagedestroy($img); //destruye la imagen
        
$image addslashes(fread(fopen($thumb_name"rb"), filesize($thumb_name))); //Arma el blob que se insertará
$image2 addslashes(fread(fopen($thumb_name2"rb"), filesize($thumb_name2))); //Arma el blob que se insertará
$image_size filesize($thumb_name);
$thumb_size filesize($thumb_name2);

        
unlink($thumb_name);//Borra el thumbnail una vez usado
        
unlink($thumb_name2);//Borra el thumbnail una vez usado

//insertamos los datos en la BD.
$consulta_insertar "INSERT INTO mi_imagen 
(id, name, image, image_size, thumb, thumb_size, type) 
VALUES ('', '$name', '$image', '$image_size', '$image2', '$thumb_size', '$type')"
;
mysql_query($consulta_insertar,$prueba) or die("No se pudo insertar los datos en la base de datos.");
header("location: mi_subir.php?status=Upload%20".$name."%20ok");  // si ha ido todo bien
exit;
?>
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 18:38.