Foros del Web » Programando para Internet » PHP »

recortar imagen imagecopyresampled() desde el centro

Estas en el tema de recortar imagen imagecopyresampled() desde el centro en el foro de PHP en Foros del Web. Hola, he hecho un script para subir imagenes a un servidor, guardar la referencia en una base de datos y que las escale y recorte ...
  #1 (permalink)  
Antiguo 13/02/2008, 17:43
Avatar de rameau1982  
Fecha de Ingreso: febrero-2007
Ubicación: Barcelona
Mensajes: 111
Antigüedad: 17 años, 2 meses
Puntos: 0
recortar imagen imagecopyresampled() desde el centro

Hola, he hecho un script para subir imagenes a un servidor, guardar la referencia en una base de datos y que las escale y recorte a un tamaño concreto: 156x215 px.
Todo sale perfecto, excepto que el recorte me lo hace siempre desde el borde superior izquierdo (como indica el manual del imagecopyresampled). Pero esto hace que no se recorte desde el centro, que es lo que quiero, me recorta o de arriba o del lado izquierdo y yo quiero que lo haga la mitad de arriba, la otra mitad de abajo, la mitad de la izquierda y la otra mitad de la derecha.
Pongo el código a ver si alguien me hecha una mano. Gracias!

Código PHP:
<?
session_name
("loginUsuario");
session_start();
$usuario=$_SESSION["usuario"];

function 
thumbjpeg($imagen,$directorio,$ancho_tn,$alto_tn,$ancho_orig,$alto_orig,$crop_width,$crop_height//ancho_tn y alto_tn son el tamaño ke deseo para el thumbnail
{
$dir_thumb=$directorio//ruta donde guardamos los thumbnails
$prefijo_thumb="tn_"//prefijo para el thumbnail
$camino_nombre=explode("/",$imagen); //por si imagen lleva una / delante
$nombre=end($camino_nombre);// Aquí tendremos el nombre de la imagen.
$anchura=$ancho_tn//le doy el ancho ke pasé
$altura=$alto_tn//le doy el alto
$anchura_orig=$ancho_orig;
$altura_orig=$alto_orig;
$cropw=$crop_width;
$croph=$crop_height;
if (!
file_exists($dir_thumb.$prefijo_thumb.$nombre)) //si no existe el thumbnail
{
$format strtolower(substr(strrchr($nombre,"."),1));
    switch(
$format)
    {
        case 
'gif' :
            
$type ="gif";
            
$img imagecreatefromgif($dir_thumb.$nombre);
            break;
        case 
'png' :
            
$type ="png";
            
$img imagecreatefrompng($dir_thumb.$nombre);
            break;
        case 
'jpg' :
            
$type ="jpg";
            
$img imagecreatefromjpeg($dir_thumb.$nombre);
            break;
        case 
'jpeg' :
            
$type ="jpg";
            
$img imagecreatefromjpeg($dir_thumb.$nombre);
            break;
        default : 
            die (
"ERROR; UNSUPPORTED IMAGE TYPE");
            break;
    }
    
$thumb imagecreatetruecolor($anchura,$altura);
imagecopyresampled ($thumb$img0000$anchura$altura$anchura_orig$altura_orig); //crea el thumbnail
if($type=="gif"){
        
imagegif($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}elseif(
$type=="jpg"){
        
imagejpeg($thumb,$dir_thumb.$prefijo_thumb.$nombre,100);
}elseif(
$type=="png"){
        
imagepng($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}elseif(
$type=="bmp"){
        
imagewbmp($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}

//imagejpeg($thumb,$dir_thumb.$prefijo_thumb.$nombre);
    
switch($format)
    {
        case 
'gif' :
            
$type ="gif";
            
$img imagecreatefromgif($dir_thumb.$prefijo_thumb.$nombre);
            break;
        case 
'png' :
            
$type ="png";
            
$img imagecreatefrompng($dir_thumb.$prefijo_thumb.$nombre);
            break;
        case 
'jpg' :
            
$type ="jpg";
            
$img imagecreatefromjpeg($dir_thumb.$prefijo_thumb.$nombre);
            break;
        case 
'jpeg' :
            
$type ="jpg";
            
$img imagecreatefromjpeg($dir_thumb.$prefijo_thumb.$nombre);
            break;
        default : 
            die (
"ERROR; UNSUPPORTED IMAGE TYPE");
            break;
    }
$thumb imagecreatetruecolor(156,215);
imagecopyresampled ($thumb$img00$cropw$croph156215156215); //crea el thumbnail

// la salvamos con el nombre y en el lugar que nos interesa.
if($type=="gif"){
        
imagegif($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}elseif(
$type=="jpg"){
        
imagejpeg($thumb,$dir_thumb.$prefijo_thumb.$nombre,100);
}elseif(
$type=="png"){
        
imagepng($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}elseif(
$type=="bmp"){
        
imagewbmp($thumb,$dir_thumb.$prefijo_thumb.$nombre);
}
return(
$prefijo_thumb.$nombre);
}
}



$directorio_foto 'C:/xampp/htdocs/nombres/fotos/';
$nombre strtr($_FILES['foto']['name'], "ñ'ÁÉÍÓÚÀÈÌÒÙáéíóúäëïöüàèìòù ""n-AEIOUAEIOUaeiouaeiouaeiou_"); 
$tamanio $_FILES['foto']['size'];
$tipo $_FILES['foto']['type'];
global 
$HTTP_POST_VARS;
copy($_FILES['foto']['tmp_name'],$directorio_foto.$nombre);
$nombre2=$directorio_foto.$nombre;
$my_image array_values(getimagesize($nombre2));
list(
$width$height$type$attr) = $my_image;
$llindar1 = (215 $width) / 156;
$llindar2 = (156 $height) / 215;
$crop1=($height-$llindar1) *156 $width;
$crop2=($width-$llindar2) * 215 $height;
$ratio=$width $height;
if(
$ratio<=0.725581){
    
$alto_nuevo=$height 156 /$width;
    
$nombre3 thumbjpeg($nombre,$directorio_foto,156,$alto_nuevo,$width,$height,0,$crop1);
}else{
    
$ancho_nuevo=$width 215 $height;
    
$nombre3 thumbjpeg($nombre,$directorio_foto,$ancho_nuevo,215,$width,$height,$crop2,0);
}
unlink($directorio_foto.$nombre);
$ar "./fotos/".$nombre3//aqui la url donde se sube la foto

$conn mysql_connect("localhost","root",""); 
mysql_select_db("nombres",$conn);
$sql "INSERT INTO fotos (id, foto, nombre) VALUES ('','$ar','$usuario')";
$result mysql_query$sql$conn) ;
header("Location: usuarios.php");
?>
  #2 (permalink)  
Antiguo 15/02/2008, 01:56
Avatar de rameau1982  
Fecha de Ingreso: febrero-2007
Ubicación: Barcelona
Mensajes: 111
Antigüedad: 17 años, 2 meses
Puntos: 0
Re: recortar imagen imagecopyresampled() desde el centro

nadie que me pueda ayudar???
gracias
  #3 (permalink)  
Antiguo 22/02/2008, 10:44
 
Fecha de Ingreso: febrero-2008
Mensajes: 1
Antigüedad: 16 años, 2 meses
Puntos: 1
Re: recortar imagen imagecopyresampled() desde el centro

Hola,

Si por ejemplo tienes...

Reguion que quieres cortar: 156x215
Tamaño de la original, por ejemplo: 500x300

para encontrar el origen XY y el final XY sería:

OrigenX = (500/2) - (156/2)
OrigenY = (300/2) - (215/2)


FinalX = (500/2) + (156/2) que es lo mismo q FinalX = OrigenX + 156
FinalY = (300/2) + (215/2) que es lo mismo q FinalY = OrigenY + 215

No he podido probarlo pero creo que qdaria asi mas o menos.

S2
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 00:09.