Ver Mensaje Individual
  #6 (permalink)  
Antiguo 10/10/2011, 00:18
Avatar de Panino5001
Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: redimensionar una imagen antes de subir web

Bueno, en html 5 puede usarse el objeto FileReader combinado con canvas para lograr ese objetivo. El problema es que, pese a que la mayoría de los navegadores modernos soportan FileReader y canvas, antiguas versiones de Explorer no los soportan.
Un ejemplo:
Código:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<script type="text/javascript">
function $(x){return document.getElementById(x);}
onload=function(){
	$('archivo').addEventListener('change',previsualizar,false);
}
function redimensionar(im,maxWidth,maxHeight){
	var i=new Image();
	i.onload=function(){
		var w=this.width,
		h=this.height,
		scale=Math.min(maxWidth/w,maxHeight/h),
		canvas=document.createElement('canvas'),
		ctx=canvas.getContext('2d');
		canvas.width=w*scale;
		canvas.height=h*scale;
		ctx.drawImage(i,0,0,w*scale,h*scale);
		$('redimensionada').innerHTML='<img src="'+canvas.toDataURL()+'">';
		$('base64Redimensionada').innerHTML=canvas.toDataURL();
		
	}
	i.src=im;
}
function previsualizar(e){
	var input=e.target,fr=new FileReader(),
	tipos=/^image\/jpg|image\/jpeg|image\/png|image\/gif$/i;
	if(input.files.length===0)return;
	if(!tipos.test(input.files[0].type)){alert("El archivo selecionado es inválido");return;}
	fr.onload=function(evt){
		var im=evt.target.result;
		$('original').innerHTML='<img src="'+im+'">';
		redimensionar(im,100,100);
	}
    fr.readAsDataURL(input.files[0]);
	
	
	
}
</script>
</head>

<body>
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
    <input type="file" name="archivo" id="archivo" />
</form>
<div id="original"></div>
<div id="redimensionada"></div>
<div id="base64Redimensionada"></div>

</body>
</html>
Si comparamos el peso de ambas imágenes veremos que son diferentes, siendo la redimensionada más liviana que la original. En cualquier momento es posible guardar la imagen redimensionada en el servidor (podemos dejarla en base64 o, en el servidor, pasarla por un base64_decode, agregarle el content-type que querramos y guardarla en el directorio que querramos). Todo el proceso de redimensión se hizo en el cliente sin uso de Flash, ActiveX o applets. Sólo javascript.

Última edición por Panino5001; 10/10/2011 a las 06:30