【问题标题】:Image resize by Javascript通过 Javascript 调整图像大小
【发布时间】:2013-07-04 06:41:34
【问题描述】:

我正在运行网络应用程序。它使用ajax上传。问题是最近用户上传了太大的图像。所以它需要更多的时间。用户对此抱怨。所以我在想的是,'如果我以某种方式通过 js 裁剪和调整图像大小,然后通过 ajax 上传将其发送到服务器,那么时间将会减少'。那么有没有办法做到这一点?有什么想法吗?

【问题讨论】:

  • 为什么不对文件大小和尺寸进行限制?
  • 可能重复,即使已经很老了,stackoverflow.com/questions/2434458/…
  • 设置限制将迫使用户自己修改。但它会失去网站订阅。

标签: javascript upload image-uploading


【解决方案1】:

一种解决方案是使用 FileReader 和 Canvas 等现代方式(但这仅适用于最新的现代浏览器)。

http://caniuse.com/filereader

http://caniuse.com/canvas

在这个例子中,我展示了如何让客户端在上传之前通过设置最大宽度和高度来调整图像大小,以维持纵横比。

在此示例中,最大宽度高度 = 64; 你的最终图像是 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>

在代码的画布部分还可以添加裁剪功能。


按照 cmets 中的要求进行编辑

c.toDataURL();

是图像 base64_string,您可以将其存储在隐藏输入中,附加到 new FormData() 或您想要的任何位置。

在服务器上

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

写入文件

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

$gd=imagecreatefromstring($image);

您还可以将整个 base64 图像字符串存储在数据库中并始终使用它。

【讨论】:

  • 只要我们选择文件,这段代码就会在 DOM 中附加一个 img 标签。通过单击按钮将该图像上传到服务器怎么样?我想我们需要将该图像获取到流并将该流上传到服务器?那么如何在服务器上把这个流转换成图片文件呢?
  • 我是 .net 人 :) 但是感谢代码,我相信有人会从这些代码中受益 ;)
  • 使用.net来解码base64,但首先用逗号分割/分解字符串,第二部分是你想要的数据。
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 2018-06-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多