Foros del Web » Programando para Internet » PHP »

Error al redimensionar imagenes

Estas en el tema de Error al redimensionar imagenes en el foro de PHP en Foros del Web. Hola: Estoy tratando de redimensionar las imagenes que los usuarios cargan por medio de la página, pero me da estos errores porque no lee la ...
  #1 (permalink)  
Antiguo 04/02/2009, 16:02
Avatar de kimmy  
Fecha de Ingreso: julio-2008
Mensajes: 841
Antigüedad: 15 años, 9 meses
Puntos: 15
Pregunta Error al redimensionar imagenes

Hola:

Estoy tratando de redimensionar las imagenes que los usuarios cargan por medio de la página, pero me da estos errores porque no lee la imagen. Esta si se guarda pero el código no la lee. Este es mi código:

<?
session_start();
$_SESSION['xxxx'] = $xxxxxx;
// incluye los archivos de función para esta aplicación
require_once("funciones.php");
$fecha = $_POST['fecha'];
$tienda = $_POST['tienda'];
$producto = $_POST['producto'];

$conexion = db_connect();
if (!$conexion)
return 0;

//empieza la redimension, tomamos la imagen temporal subida
$archivo = getimagesize($_FILES['foto']['tmp_name']);
$archivo = explode('.', stripslashes($_FILES['foto']['tmp_name']));
unset($archivo[count($archivo)-1]);
$archivo = implode('.', $archivo);
switch ($archivo[2]) {
case 1:
$imagen = imagecreatefromgif($_FILES['foto']['tmp_name']); break;
case 2:
$imagen = imagecreatefromjpeg($_FILES['foto']['tmp_name']); break;
case 3:
$imagen = imagecreatefrompng($_FILES['foto']['tmp_name']); break;
// etcétera //
}

$original = $imagen;
$original_w = imagesx($original);
$original_h = imagesy($original);

$max = 175; //AQUI PONES EL TAMAÑO DE LA IMAGEN A LO QUE QUIERAS

if($original_w>$original_h) {
$muestra_w = $max;
$muestra_h = intval(($original_h/$original_w)*$max);
} else {
$muestra_w = intval(($original_w/$original_h)*$max);
$muestra_h = $max;
}

$muestra = imagecreatetruecolor($muestra_w,$muestra_h);

$muestra = imagecreatetruecolor($muestra_w,$muestra_h);

imagecopyresampled($muestra,$original,0,0,0,0, $muestra_w,$muestra_h,$original_w,$original_h);
imagedestroy($original); // aqui destruyo el original, pues no hace falta ya

// me verifica haya sido cargado el archivo
$ruta_destino = "../fotos/";
$namefinal= trim ($_FILES['foto']['tmp_name']);//quito espacios finales o al principio del nombre si los hay
$namefinal= ereg_replace (" ", "", $namefinal);//quito los espacios entre las palabtas del nombre si los hay
$uploadfile= $ruta_destino . $namefinal;
if(imagejpeg($muestra,$uploadfile,'100')) { // se coloca en su lugar final
echo "<b>Upload exitoso!. Datos:</b><br>";
echo "Nombre: <i><a href=\"".$uploadfile."\">".$_FILES['foto']['tmp_name']."</a></i><br>";
echo "Tipo MIME: <i>".$_FILES['foto']['type']."</i><br>";
echo "Peso: <i>".$_FILES['foto']['size']." bytes</i><br>";
echo "<br><hr><br>";
}

//Insercion de los datos, ojo la imagen se graba con su nombre original en la tabla (es un campo varchar)
$sql_ins = "INSERT INTO products (fecha, tienda, producto, sku) " .
"VALUES ('$fecha', '$tienda', '$producto', '$archivo')";
$res = mysql_query($sql_ins) or die ( "Error MySQL dice: " . mysql_error() );
?>

Me da los siguientes errores:

Warning: imagesx(): supplied argument is not a valid Image resource in C:\AppServ\www\phpMyAdmin\xxxx.php on line 44

Warning: imagesy(): supplied argument is not a valid Image resource in C:\AppServ\www\phpMyAdmin\xxxx.php on line 45

Warning: Division by zero in C:\AppServ\www\phpMyAdmin\xxxx.php on line 53

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in C:\AppServ\www\phpMyAdmin\xxxx.php on line 57

Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions in C:\AppServ\www\phpMyAdmin\xxxx.php on line 59

Warning: imagecopyresampled(): supplied argument is not a valid Image resource in C:\AppServ\www\phpMyAdmin\xxxx.php on line 61

Warning: imagedestroy(): supplied argument is not a valid Image resource in C:\AppServ\www\phpMyAdmin\xxxx.php on line 62

Warning: imagejpeg(): supplied argument is not a valid Image resource in C:\AppServ\www\phpMyAdmin\xxxx.php on line 69

Por favor me pueden ayudar a saber que error tengo en el código.

Gracias
  #2 (permalink)  
Antiguo 04/02/2009, 16:14
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error al redimensionar imagenes

Código PHP:
//empieza la redimension, tomamos la imagen temporal subida
$archivo getimagesize($_FILES['foto']['tmp_name']);

/* ******* Deshabilitamos el bloque que creo que esta mal
// Esta linea crea nuevamente el array $archivo, pero basado en el nombre de la imagen
$archivo = explode('.', stripslashes($_FILES['foto']['tmp_name']));
unset($archivo[count($archivo)-1]);

// Esta linea convierte $archivo en una cadena
$archivo = implode('.', $archivo);
************************** */

switch ($archivo[2]) {
case 
1:
$imagen imagecreatefromgif($_FILES['foto']['tmp_name']); break;
case 
2:
$imagen imagecreatefromjpeg($_FILES['foto']['tmp_name']); break;
case 
3:
$imagen imagecreatefrompng($_FILES['foto']['tmp_name']); break;
// etcétera //
}

if(!
$imagen)
    die(
'No se pudo crear la imagen.'); 
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 04/02/2009, 16:22
Avatar de kimmy  
Fecha de Ingreso: julio-2008
Mensajes: 841
Antigüedad: 15 años, 9 meses
Puntos: 15
Respuesta: Error al redimensionar imagenes

Hola Triby, gracias por tu respuesta. Hice lo que me indicaste y ahora me arroja lo siguiente:

Warning: imagejpeg() [function.imagejpeg]: Unable to open '../fotos/C:\WINDOWS\Temp\php241E.tmp' for writing: Invalid argument in C:\AppServ\www\phpMyAdmin\xxxx.php on line 70

No lo entiendo ¿¿¿????
  #4 (permalink)  
Antiguo 04/02/2009, 16:32
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error al redimensionar imagenes

No estabas creando bien el nombre del archivo final:

Código PHP:
// me verifica haya sido cargado el archivo
$ruta_destino "../fotos/";

// Obtenemos solo el nombre del archivo, sin espacios ni rutas
$namefinal trim(end(explode('/'str_replace("\\"'/'$_FILES['foto']['tmp_name']))));

// Quitamos la extension
list($namefinal$extension) = explode('.'$namefinal);

// Quitamos espacios y convertimos a minusculas
$namefinal strtolower(str_replace(' ''-'$namefinal));

// Agregamos la extension .jpg
$uploadfile$ruta_destino $namefinal '.jpg'

if(
imagejpeg($muestra,$uploadfile,'100')) 
Eso debiera funcionar, a menos que se me haya escapado algun parentesis... si tienes dudas sobre lo que hace cada cosa, pregunta, no solo copies y pegues.
__________________
- León, Guanajuato
- GV-Foto
  #5 (permalink)  
Antiguo 04/02/2009, 16:56
Avatar de kimmy  
Fecha de Ingreso: julio-2008
Mensajes: 841
Antigüedad: 15 años, 9 meses
Puntos: 15
Respuesta: Error al redimensionar imagenes

Tienes razón tengo que entender el código. No se que hace el end en la siguiente linea:

// Obtenemos solo el nombre del archivo, sin espacios ni rutas
$namefinal = trim(end(explode('/', str_replace("\\", '/', $_FILES['foto']['tmp_name']))));


también tengo el problema de que me guarda en la carpeta donde le indique pero guarda un archivo todo extraño (no es jpg, ni gift, ni png) y antes de incluir lo de la redimension si me guardaba bien las fotos. Yo al final ponía este código:

$nuevo_nombre = $_FILES['foto']['tmp_name'];
move_uploaded_file($_FILES['foto']['tmp_name'], "../fotos/$nuevo_nombre");

y esto es lo que me arroja:

Upload exitoso!. Datos:
Nombre: C:\WINDOWS\Temp\php2974.tmp
Tipo MIME: image/pjpeg
Peso: 32095 bytes

Warning: move_uploaded_file(../fotos/C:\WINDOWS\Temp\php2974.tmp) [function.move-uploaded-file]: failed to open stream: Invalid argument in C:\AppServ\www\phpMyAdmin\xxxx.php on line 87

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\Temp\php2974.tmp' to '../fotos/C:\WINDOWS\Temp\php2974.tmp' in C:\AppServ\www\phpMyAdmin\xxxx.php on line 87

Warning: Cannot modify header information - headers already sent by (output started at C:\AppServ\www\phpMyAdmin\xxxx.php:75) in C:\AppServ\www\phpMyAdmin\xxxx.php on line 88

Como puedes ver estoy bastante confundida, me ha costado bastante entender todo lo de la redimension de imagenes.

Por favor si puedes explicarme que estoy haciendo pues me pierdo bastante.

Gracias
  #6 (permalink)  
Antiguo 04/02/2009, 17:10
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error al redimensionar imagenes

end() es el ultimo elemento de una matriz, en este caso, la generada por explode.

Te explico rapidamente:
- El nombre completo es: C:\WINDOWS\Temp\php2974.tmp
- Con str_replace modificamos a : C:/WINDOWS/Temp/php2974.tmp
----- El paso anterior es para que funcione tanto en windows como en linux
- Con explode lo convertimos en una matriz: ('C:', 'WINDOWS', 'Temp', 'php2974.tmp')
- Con end obtenemos el ultimo elemento: php2974.tmp

- En las lineas siguientes solo lo preparamos para que quede el nombre de archivo destino correcto: ../fotos/php2974.jpg

Y con eso se debe solucionar tu problema

Edito:

Lo siento, lo correcto es asi:
Código PHP:
// me verifica haya sido cargado el archivo
$ruta_destino "../fotos/";

// Obtenemos el nombre original del archivo
// Quitamos espacios y convertimos a minusculas
$namefinal strtolower(str_replace(' ''-'$_FILES['foto']['name']));

// Agregamos la extension .jpg
$uploadfile$ruta_destino $namefinal '.jpg'

if(
imagejpeg($muestra,$uploadfile,'100')) 
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 04/02/2009 a las 17:15 Razón: Codigo corregido
  #7 (permalink)  
Antiguo 04/02/2009, 17:17
Avatar de kimmy  
Fecha de Ingreso: julio-2008
Mensajes: 841
Antigüedad: 15 años, 9 meses
Puntos: 15
Respuesta: Error al redimensionar imagenes

ok, entiendo. Dos preguntas más:

1) Esto solo guarda las imagenes jpg??

2) Cómo hago para que me guarde con otro nombre diferente a php2D85, por ejmplo que la guarde con alguna mezcla de letras y numeros (como un corelativo de productos)?

Gracias.
  #8 (permalink)  
Antiguo 04/02/2009, 17:27
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Error al redimensionar imagenes

1- Solo guarda jpg porque asi es la instruccion que estas ejecutando: imagejpeg($muestra, $uploadfile, '100')

2- En el mensaje anterior, ya editado te puse el codigo correcto para guardar con el nombre original del archivo.
__________________
- León, Guanajuato
- GV-Foto
  #9 (permalink)  
Antiguo 04/02/2009, 18:13
Avatar de kimmy  
Fecha de Ingreso: julio-2008
Mensajes: 841
Antigüedad: 15 años, 9 meses
Puntos: 15
Muchas Gracias Triby funciona muy bien.

Una pregunta. Al tratar de llamar las imagenes con mi código en otro lado no me las muestra. Este es el código:

function mostrar_productos($product_array)
{
//display all products in the array passed in
if (!is_array($product_array))
{
echo "<br>No products currently available in this category<br>";
}
else
{
//create table
echo "<table width = \"100%\" border = 0>";

//create a table row for each product
foreach ($product_array as $row)
{
$url = "mostrar_productos.php?sku=".($row["sku"]);
echo "<tr><td>";
if(@file_exists("fotos/".$row["sku"]. ".jpg")){
$title= "<img src=\"fotos/".($row["sku"]). ".jpg\" border=0>";
do_html_url($url, $title);
}
else
{
if(@file_exists("fotos/".$row["sku"]. ".gif"))
$title= "<img src=\"fotos/".($row["sku"]). ".gif\" border=0>";
do_html_url($url, $title);
}
echo "&nbsp;";
}
echo "</td><td>";
$title = $row["nombre"]." by ".$row["tienda"];
do_html_url($url, $title);
echo "</td></tr>";
echo "</table>";
}
echo "<hr>";
}

Yo creo que es porque le agrego .jpg y .gift pero al tratar de quitarselos así:

function mostrar_productos($product_array)
{
//display all products in the array passed in
if (!is_array($product_array))
{
echo "<br>No products currently available in this category<br>";
}
else
{
//create table
echo "<table width = \"100%\" border = 0>";

//create a table row for each product
foreach ($product_array as $row)
{
$url = "mostrar_productos.php?sku=".($row["sku"]);
echo "<tr><td>";
if(@file_exists("fotos/".$row["sku"]. ")){
$title= "<img src=\"fotos/".($row["sku"]). border=0>";
do_html_url($url, $title);
}
echo "&nbsp;";
}
echo "</td><td>";
$title = $row["nombre"]." by ".$row["tienda"];
do_html_url($url, $title);
echo "</td></tr>";
echo "</table>";
}
echo "<hr>";
}

Me da el siguiente error:

Parse error: syntax error, unexpected T_STRING in C:\AppServ\www\phpMyAdmin\xxxxx.php on line 297

Me imagino que es en estas lineas que no se como van:

if(@file_exists("fotos/".$row["sku"]. ")){
$title= "<img src=\"fotos/".($row["sku"]). border=0>";

gracias por tu ayuda

lo que pasa es que me confundo con la concatenación:

if(@file_exists("fotos/".$row["sku"]. ")){
$title= "<img src=\"fotos/".($row["sku"]). border=0>";

las comillas son para fotos/ o para .$row["sku"].

Siempre me pierdo porque no se cual es la estructura de la concatenación.

???

ya lo resolví, el código estaba bien. Era otra parte. Gracias a todos, gracias Triby.

Última edición por GatorV; 04/02/2009 a las 20:55
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 01:22.