Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Image resize by Javascript

I've web app running. And it uses ajax upload. The issue is recently users are uploading too big images. So it's taking a bit more time. Users are complaining about that. So what I was thinking is this, 'If I somehow crop and resize the image via js and then send it to the server via ajax upload then the time will be reduced'. So is there any way to do that? Any idea for it?

like image 946
Mazhar Ahmed Avatar asked Dec 06 '22 06:12

Mazhar Ahmed


1 Answers

A solution is to use modern ways like FileReader and Canvas (But this works only on the latest modern browsers).

http://caniuse.com/filereader

http://caniuse.com/canvas

In this example i show how to let the client resize an image before uploading by setting a max width & height mantaining aspect ratio.

In this example max widthHeight = 64; your final image is c.toDataURL();

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script>
var h=function(e){
 var fr=new FileReader();
 fr.onload=function(e){
  var img=new Image();
  img.onload=function(){
     var MAXWidthHeight=64;
   var r=MAXWidthHeight/Math.max(this.width,this.height),
   w=Math.round(this.width*r),
   h=Math.round(this.height*r),
   c=document.createElement("canvas");
   c.width=w;c.height=h;
   c.getContext("2d").drawImage(this,0,0,w,h);
   this.src=c.toDataURL();
   document.body.appendChild(this);
  }
  img.src=e.target.result;
 }
 fr.readAsDataURL(e.target.files[0]);
}
window.onload=function(){
 document.getElementById('f').addEventListener('change',h,false);
}
</script>
</head>
<body>
<input type="file" id="f">
</body>
</html>

In the canvas part of the code you can also add a cropping function.


Edit as asked in the comments

c.toDataURL();

is the image base64_string you can store it in a hidden input,append to a new FormData() or wherever you want.

on the server

$data=explode(',',$base64_string);
$image=base64_decode($data[1]);

write to file

$f=fopen($fileName,"wb");
fwrite($f,$image); 
fclose($f);

or

$gd=imagecreatefromstring($image);

you can also store the whole base64 image string in the database and always use that.

like image 151
cocco Avatar answered Dec 11 '22 09:12

cocco