首页 > web前端 > js教程 > 正文

JS实现图片压缩与预览功能_javascript技巧

夢幻星辰
发布: 2025-10-30 15:23:01
原创
431人浏览过
答案:通过JavaScript结合FileReader、Canvas和Blob实现图片上传前的压缩与预览。首先利用FileReader读取图片并生成base64预览,再通过Canvas绘制并缩放图片,调用toDataURL方法按质量压缩,最后将压缩后的base64数据用于预览或转为Blob上传,有效减少文件体积,提升上传效率与用户体验。

js实现图片压缩与预览功能_javascript技巧

前端开发中,图片上传前的压缩与预览功能非常实用,既能提升用户体验,又能减少服务器压力。使用 JavaScript 可以轻松实现这一功能,无需依赖后端处理。下面介绍如何通过原生 JS 实现图片压缩与本地预览。

选择图片并生成预览

用户选择图片后,可以通过 FileReader 读取文件内容,并将结果设置为 img 标签的 src,实现即时预览。

示例代码:

<input type="file" id="upload" accept="image/*">
<img id="preview" src="" alt="预览图" style="max-width: 300px;">
<p><script>
document.getElementById('upload').addEventListener('change', function(e) {
const file = e.target.files[0];
if (!file) return;</p><p>const reader = new FileReader();
reader.onload = function(event) {
document.getElementById('preview').src = event.target.result;
};
reader.readAsDataURL(file);
});
</script></p>
登录后复制

使用 Canvas 压缩图片

图片压缩的核心是利用 canvas 的绘图能力,将原始图片绘制到 canvas 上,并通过调整尺寸或质量来实现压缩。

立即学习Java免费学习笔记(深入)”;

关键步骤:

一览AI绘图
一览AI绘图

一览AI绘图是一览科技推出的AIGC作图工具,用AI灵感助力,轻松创作高品质图片

一览AI绘图45
查看详情 一览AI绘图
  • 创建一个 Image 对象加载原始图片
  • 使用 canvas 绘制图片(可缩放)
  • 调用 canvas.toDataURL(type, quality) 输出压缩后的 base64 数据

压缩函数示例:

function compressImage(file, maxWidth = 800, quality = 0.8) {
  return new Promise((resolve) => {
    const img = new Image();
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
<pre class='brush:php;toolbar:false;'>const reader = new FileReader();
reader.onload = function(e) {
  img.src = e.target.result;
};

img.onload = function() {
  let { width, height } = img;

  // 按最大宽度等比缩放
  if (width > maxWidth) {
    height = Math.round((height * maxWidth) / width);
    width = maxWidth;
  }

  canvas.width = width;
  canvas.height = height;

  ctx.drawImage(img, 0, 0, width, height);

  // 导出压缩后的图片(JPEG 格式,质量 0.8)
  const compressedData = canvas.toDataURL('image/jpeg', quality);
  resolve(compressedData);
};

reader.readAsDataURL(file);
登录后复制

}); }

完整使用流程

将选择、压缩和预览结合在一起:

document.getElementById('upload').addEventListener('change', async function(e) {
  const file = e.target.files[0];
  if (!file) return;
<p>// 压缩图片
const compressedDataURL = await compressImage(file, 800, 0.7);</p><p>// 显示预览
const preview = document.getElementById('preview');
preview.src = compressedDataURL;</p><p>// 如需上传,可将 base64 转为 Blob 发送
// const blob = dataURLToBlob(compressedDataURL);
});</p>
登录后复制

如需将 base64 转为 Blob 用于上传:

function dataURLToBlob(dataurl) {
  const arr = dataurl.split(',');
  const mime = arr[0].match(/:(.*?);/)[1];
  const bstr = atob(arr[1]);
  let n = bstr.length;
  const u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}
登录后复制

基本上就这些。通过 FileReader 预览,Canvas 压缩,再配合 Blob 转换,就能高效实现图片上传前的处理,既节省带宽,又提升响应速度。

以上就是JS实现图片压缩与预览功能_javascript技巧的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号