entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Cambiar tamaño de imagen al subir

Tengo un código para subir imágenes pero necesito definir un tamaño máximo y convertir las imágenes a un tamaño especifico, hasta ahora uso este código:

<?  
if($_POST){ 

$str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"; 
$cad = ""; 
for($i=0;$i<12;$i++) { 
$cad .= substr($str,rand(0,62),1); 
} 

$tamano = $_FILES [ 'file' ][ 'size' ]; 
$tamaño_max="3145728"; // Tamaño maximo permitido (3 MB)
if( $tamano < $tamaño_max){ 
$destino = 'subida/avatar' ; 
$id = $_SESSION['id'];
$sep=explode('image/',$_FILES["file"]["type"]); 
$tipo=$sep[1]; 
if($tipo == "jpg" || $tipo == "jpeg" || $tipo == "png" || $tipo == "gif"){ 
move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $destino . '/' .$cad.'.'.$tipo);  
$url = $destino . '/' .$cad.'.'.$tipo;
$conectar = @mysql_connect($nombre_server[1],$nombre_user[2],$password[3]) or exit('Datos de conexion incorrectos.');
mysql_select_db($nombre_db[4]) or exit('No existe la base de datos.');

mysql_query("UPDATE usuarios SET avatar = '$url' WHERE id = $id ") 
or die (mysql_error()); 
mysql_close(); 
include('listo_avatar.php'); 
} 
else echo "El tipo de archivo no es de los permitidos.";
} 
else echo "El archivo supera el peso permitido.";
} 
?>

2 Respuestas

3votos

white Puntos75880

Podrías usar la funcion imagecopyresized para esto.

en tu codigo despues de

move_uploaded_file ( $_FILES [ 'file' ][ 'tmp_name' ], $destino . '/' .$cad.'.'.$tipo);

agrega:

$path = $destino . '/' .$cad.'.'.$tipo;
$resize = array(250, 250);
$img_size = getimagesize($path);

$ratio = $img_size[0]/$img_size[1];

if ($resize[0]/$resize[1] > $ratio)
   $resize[0] = $resize[1] * $ratio;

else
   $resize[1] = $resize[0]/$ratio;

$func_images = array(
    'jpeg' => array('imagecreatefromjpeg', 'imagejpeg'),
    'jpg' => array('imagecreatefromjpeg', 'imagejpeg'),
    'png' => array('imagecreatefrompng', 'imagepng'),
    'gif' => array('imagecreatefromgif', 'imagegif')
);

$img = call_user_func($func_images[$tipo][0], $path);

$new_img = imagecreatetruecolor($resize[0], $resize[1]);

imagecopyresized($new_img, $img, 0, 0, 0, 0, $resize[0], $resize[1], $img_size[0], $img_size[1]);

call_user_func($func_images[$tipo][1], $new_img, $path);

cambia esta linea: $resize = array(250, 250);, por tu tamaño deseado es (ancho, alto)

te recomiendo usar una libreria si vas a manipular imagenes y deseas hacerlo de una manera profesional, phpimageworkshop es una de ellas:

http://phpimageworkshop.com/tutorial/2/creating-thumbnails.html

Ademas de sugerirte de la mejor manera hacer uso de mysqli a cambio de mysql

0voto

Leonardo-Tadei comentado

Esto no deforma la miniatura salvo que la imagen original sea cuadrada ???

0voto

white comentado

tienes toda la razon @Leonardo, se me paso por alto el mantener la relacion de aspecto
ahí edite el codigo :)

0voto

Mariio comentado

Al agregarlo me aparece el siguiente error al subir una imagen

Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in /home/ets2mp/public_html/web/subida/dl/avatar.php on line 38

Warning: imagecopyresized() expects parameter 2 to be resource, null given in /home/ets2mp/public_html/web/subida/dl/avatar.php on line 42

Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in /home/site/public_html/web/subida/dl/avatar.php on line 44

Sobre lo de las imágenes solo lo usare para cambiar perfil

0voto

white comentado

reemplaza todos los $type por $tipo en tu archivo. no me fije que la variable tenia ese nombre.

0voto

Mariio comentado

Hay funciono, muchas gracias :D

Eso si el código achica la imagen y pierde calidad, como puedo hacer para que la recorte o algún método más efectivo?

Edit 2: Para los que desean guardar con mas calidad envés de usar "imagecopyresized" deben usar "imagecopyresampled"

3votos

Leonardo-Tadei Puntos227320

Hola @fabyold,

yo para esto armé hace unos años esta función. La idea es usarla en lugar de move_uploaded_file() pasándole además el tamaño en píxeles que querés que tenga.

No estoy seguro de que se pueda cambiar el tamaño de una imagen para que ocupe una cierta cantidad de MB, ya que el tamaǹo depende del tipo de imagen y a su vez del tipo de compresión que use. Por eso lo que se hace generalmente es poner un límite de alto y ancho en píxeles en vez de un límite por tamaño.

Otra cosa es que no aceptes archivos demasiado grandes como entrada, de forma tal de no matar la CPU haciendo las muchas reducciones...

A tus tipos de archivos válidos, agregales además el "ejpeg" que es como algunos IExplorer mandan los JPG.

<?php
/*
* @Prometeus Technology, a subsidiary of Pegasus Tech Supply
* @copyright Copyright (C) 2005-2015 Leonardo Tadei. All rights reserved.
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see gpl-3.0.txt
* MoveRedimImg is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses.
*/

//Esto es lo mismo que el archivo imredim.php pero para modificar el tamaño de un archivo y no para devolver un thumbail
//llamado como imgredim.php?org=xxx&max=xxx
function MoveRedimImg($nom_img_org, $nom_img_dest, $alto_max = 600, $ancho_max = 800){

  if ( intval($alto_max) == 0 ) {
    $alto_max = 500;
  }
  if ( intval($ancho_max) == 0 ) {
    $ancho_max = 500;
  }

  // determina el tipo de archivo para hacer el Content-type
  $size = getimagesize($nom_img_org);
//  print_r($size);
//  print($size['mime']); exit;
switch($size[2]){
    case 1: $mime = "image/gif";
            break;
    case 2: $mime = "image/jpeg";
            break;
    case 3: $mime = "image/png";
            break;
  }
  /*header("Content-type: $mime");*/
  //header ("Content-type: image/jpeg");

  $attrib_img_org = GetImageSize($nom_img_org);
  $ancho_img_org = $attrib_img_org[0];
  $alto_img_org  = $attrib_img_org[1];
  // Calcula el ancho y el alto del thumbnail desde un alto dado
if ($ancho_img_org > $ancho_max){
        $ancho_img_des  = $ancho_max;
        $alto_img_des = round($ancho_max * $alto_img_org / $ancho_img_org);
} else {
        $alto_img_des  = $alto_img_org;
        $ancho_img_des = $ancho_img_org;
}

if ($alto_img_des > $alto_max) {
        $alto_img_des  = $alto_max;
        $ancho_img_des = round($alto_max * $ancho_img_org / $alto_img_org);
}

  // Abre Imagen Original
  switch ($mime) {
        case "image/jpeg":  $img_org = @ImageCreateFromJPEG($nom_img_org); /* Attempt to open */
                            break;
        case "image/gif":   $img_org = @ImageCreateFromGIF($nom_img_org); /* Attempt to open */
                            break;
        case "image/png":   $img_org = @ImageCreateFromPNG($nom_img_org); /* Attempt to open */
                            break;
  }

  // Crea la imágen Destino
  $img_des = @imagecreatetruecolor ($ancho_img_des, $alto_img_des);

  // int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH)
  imagecopyresampled ($img_des, $img_org,
                    0, 0, 0, 0,
                    $ancho_img_des, $alto_img_des,
                    $ancho_img_org, $alto_img_org);
  // Banner ;-)
  //$text_color = ImageColorAllocate ($img_des, 128, 128, 255);
  //ImageString ($img_des, 2, 5, 15,  "E Sociales", $text_color);

  switch ($mime) {
        case "image/jpeg":
            ImageJPEG ($img_des, $nom_img_dest);
            break;
        case "image/gif":
            ImageGIF ($img_des, $nom_img_dest);
            break;
        case "image/png":
            ImagePNG ($img_des, $nom_img_dest);
            break;
  }
//  ImageJPEG ($img_des);

    // Finalemente, borra el archivo origen
    @unlink($nom_img_org);

    return true;
}
?>

Saludos cordiales!

0voto

Mariio comentado

El problema es que mi código le agregue mysql para que enviara la url a la db para cambiar la foto de perfil, no puedo usar otro código porque si no me pierdo xD

0voto

Leonardo-Tadei comentado

@fabyold, no entiendo tu comentario: con mi función , solo tenés que reemplazar move_uploaded_file() por MoveRedimImg().

El código no usa ni tiene nada que ver con la DB.

0voto

Mariio comentado

Hay entendí, aunque el código de white es más corto pero se agradece la ayuda :D

0voto

Leonardo-Tadei comentado

Si le sacás los comentarios, es el mismo código y es compatible hasta con PHP 4... salvo que yo uso un switch en vez de una función callback.

Me alegra que hayas solucionado el problema!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta