在上传到服务器之前,使用 JavaScript 在客户端调整图像大小

IT技术 javascript image resize client-side
2021-01-15 01:18:54

我正在寻找一种使用 JavaScript 调整图像客户端大小的方法(真正调整大小,而不仅仅是更改宽度和高度)。
我知道可以在 Flash 中执行此操作,但如果可能,我想避免使用它。

网络上有什么开源算法吗?

6个回答

这是执行此操作的要点:https : //gist.github.com/dcollien/312bce1270a5f511bf4a

(一个 es6 版本和一个 .js 版本,可以包含在脚本标签中)

您可以按如下方式使用它:

<input type="file" id="select">
<img id="preview">
<script>
document.getElementById('select').onchange = function(evt) {
    ImageTools.resize(this.files[0], {
        width: 320, // maximum width
        height: 240 // maximum height
    }, function(blob, didItResize) {
        // didItResize will be true if it managed to resize it, otherwise false (and will return the original file as 'blob')
        document.getElementById('preview').src = window.URL.createObjectURL(blob);
        // you can also now upload this blob using an XHR.
    });
};
</script>

它包括一堆支持检测和 polyfills,以确保它在我能管理的尽可能多的浏览器上工作。

(它也会忽略 gif 图像 - 如果它们是动画的)

嗨,我需要一个像这样使用的片段,我认为这很好,但是.. function(blob, didItResize) { // 如果它设法调整大小,则 didItResize 将为真,否则为假(并将返回原始文件为 'blob') document.getElementById('preview').src = window.URL.createObjectURL(blob); // 您现在还可以使用 XHR 上传此 blob。在这里我有一个问题.. 我怎样才能通过提交表格以表格形式发送这张图片。我的意思是,就像提交按钮触发的发布请求一样。你知道,通常的方式。谢谢你的要点!
2021-03-13 01:18:54
我觉得你没有得到足够的赞美 - 我认为它很好用,而且非常容易。感谢分享!
2021-03-17 01:18:54
嗯..我在这方面取得了很好的成功,但我发现我的图像(除了被调整大小)也遭受了巨大的质量损失(以严重像素化的形式),尽管它以正确的分辨率输出。
2021-03-22 01:18:54
有没有机会把它做成一个 npm 包?会超级棒的!
2021-04-09 01:18:54
对于具有质量(重采样)损失任何人,更新画布上下文设定imageSmoothingEnabled为TRUE;和imageSmoothingQualityhigh在typescript中,该块看起来像: const ctx = canvas.getContext('2d'); ctx.imageSmoothingEnabled = true; (ctx as any).imageSmoothingQuality = 'high'; ctx.drawImage(image, 0, 0, width, height);
2021-04-11 01:18:54

答案是肯定的 - 在 HTML 5 中,您可以使用 canvas 元素在客户端调整图像大小。您还可以获取新数据并将其发送到服务器。请参阅本教程:

http://hacks.mozilla.org/2011/01/how-to-develop-a-html5-image-uploader/

canvas.mozGetAsFile("foo.png"); 是一个不推荐使用的函数
2021-03-24 01:18:54
这是一个仅链接的答案,因此应该是评论。
2021-03-28 01:18:54

如果您在上传之前调整大小,我刚刚发现这个 http://www.plupload.com/

它以任何可以想象的方法为您带来所有魔力。

不幸的是,只有 Mozilla 浏览器支持 HTML5 调整大小,但您可以将其他浏览器重定向到 Flash 和 Silverlight。

我刚试过,它和我的安卓系统一起工作!

在 flash中使用http://swfupload.org/,它的工作非常好,但调整大小非常小。(不记得限制了)并且在 flash 不可用时不会回到 html4。

小心,因为 plupload 是 AGPL。
2021-03-29 01:18:54
当用户尝试上传一张 10mb 的照片,而这张照片只会被存储为一张小得多的照片时,在客户端调整大小是件好事。这样上传会快很多。
2021-04-01 01:18:54
同样的场景,只要你有一个文件输入并且用户在智能手机上并使用相机拍摄图像,它在现代智能手机上将是大约 10 mb。如果您在服务器端调整它的大小并且只存储它的一个小得多的版本,那么在客户端预先调整大小时,您将节省大量蜂窝数据和加载时间。
2021-04-04 01:18:54

http://nodeca.github.io/pica/demo/

在现代浏览器中,您可以使用画布来加载/保存图像数据。但是,如果您在客户端调整图像大小,则应记住以下几点:

  1. 每个通道只有 8 位(jpeg 可以有更好的动态范围,大约 12 位)。如果您不上传专业照片,那应该不是问题。
  2. 小心调整大小算法。大多数客户端调整器使用微不足道的数学,结果比预期的更糟。
  3. 您可能需要锐化缩小的图像。
  4. 如果您希望重用原始元数据(exif 和其他) - 不要忘记去除颜色配置文件信息。因为它在您将图像加载到画布时应用。

也许使用画布标签(尽管它不是便携式的)。有一个关于如何使用画布旋转图像的博客here,我想如果你可以旋转它,你可以调整它的大小。也许它可以是一个起点。

另请参阅此库

非常有用的例子。您可能希望在答案中添加一两个片段,以防这些链接中断。
2021-03-16 01:18:54