当前位置: 首页 > news >正文

前端图片压缩三方库browser-image-compression的使用实践

上篇文章是deepseek给出的前端图片压缩方案建议,后经过查看各第三方库的github项目和压缩后相同大小文件的对比,可以得出结论,这几个三方库其实也都是浏览器原生Canvas API的封装.当然,不管它们怎么实现的,只要用起来方便好用就行了,其中browser-image-compression支持WebWorker,压缩大图片时不易阻塞界面交互, image-conversion特色是压缩到指定大小,我的需求还是保证肉眼看不出明细区别为前提,尽量压缩,所以固定一个大小并不是我的需求,测试过大小设置太小则大图片失真严重,设置过大则小图片基本没压缩,最终还是使用前者,前者一个主意事项是,压缩后返回的是blob,如果原来上传方法要传file,则要转换一下,方法和其他注意事项见代码:

 1 // 循环对图片进行上传,如果有上传失败的进行提示
 2       // console.log("=====上传前图片==", fileList.value)
 3       for (const item of fileList.value) {
 4 
 5         if (item.status === 'done') {
 6           continue
 7         }
 8         const sourceFile = item.file;
 9         if (sourceFile) {
10 
11           let upFile = null
12           //如果是图片
13           if (sourceFile.type && sourceFile.type.startsWith('image/')) {
14             // 对图片进行压缩
15             const options = {
16               maxSizeMB: 0.5, // 最大文件大小(MB)(作用不大,主要看质量和分辨率)
17               // maxWidthOrHeight: 8000, // 最大宽或高
18               useWebWorker: true, // 使用WebWorker,避免阻塞界面
19               initialQuality: 0.6, // 初始压缩质量(0-1)(经测试0.6及以上肉眼看区别不明显,以下会出现偏色色块)
20               alwaysKeepResolution: true,//保持高宽(即保持分辨率,对有文字的图片,能最大程度保证文字可读)
21             };
22             try {
23               const compressedFile = await imageCompression(sourceFile, options);
24               // console.log('压缩成功,压缩后大小===', compressedFile.size/1024 +'K');
25               // 压缩后是blob需要转换回file
26               upFile = new File([compressedFile], compressedFile.name, { type: compressedFile.type });
27             } catch (error) {
28               console.error('压缩失败:', error);
29             }
30           }
31           if(upFile == null) {
32             upFile = sourceFile;
33           }
34           const formData = new FormData();
35 
36           formData.append('file', upFile);
37           formData.append('checkId', resData.id);
38           formData.append('upType', '1');// 类型:问题照片
39 
40           const uploadRes = await AxiosPost( VITE_APP_API_CHECKS+'/api/checks/checks/uploadImg', formData)
41           // 如果失败,进行提示
42           if(!uploadRes.success){
43             showFailToast('上传失败!'+uploadRes.msg)
44             return
45           }
46 
47           // console.log('===========uploadRes:', uploadRes)
48         }
49       }

 

http://www.gsyq.cn/news/40874.html

相关文章:

  • 如何处理旧 iPhone:安全地回收或重新利用 - 实践
  • 【Android】一种应用霸屏方式:设置固定应用
  • 2025年密闭冷却塔品牌排名推荐:密闭冷却塔加工厂价格哪家合理
  • Apache SeaTunnel 支持 Metalake 开发了!避免任务配置敏感信息暴露
  • HR内耗终结者:Moka People实现招聘、人事、薪酬全流程数据一体化,提效200%
  • 告别“功能堆砌陷阱”,2026年企业HR系统选型应聚焦价值而非价格
  • 线程和 Parallel.ForEach 的核心区别
  • 2025年五大文物展柜制造企业推荐,文物展柜来样定制企业全解析
  • 现今西南碳晶板制造厂技术评测与选择指南
  • keycloak~登录时将请求头里某个属性放入UserSessionModel
  • 深入解析:微信开放平台第三方平台,可以管理多个微信小程序
  • 2025年照明灯具源头厂家推荐前十排行权威指南
  • 2025年成都照明灯具供应厂家排名前十推荐
  • 2025年11月冷再生机工厂前十推荐排行榜单:江苏环硕建设领跑行业
  • 2025年陕西省基本农田调整技术服务十大品牌权威排名
  • 2025年陕西省基本农田调整技术服务十大品牌权威评测
  • 如何使用PortTunnel端口映射工具?
  • 关于Microsoft Power Automate-中-数据表的复制-副本
  • [Python刷题笔记]-相交链表-链表+哈希/双指针-简单
  • 行专列
  • P9837 汪了个汪 小结
  • 用 Python+OpenCV 实现实时文档扫描:从摄像头捕捉到透视矫正全流程 - 详解
  • 2025德语学习机构推荐:在线德语网课学习课程+真人互动+系统备考详解!
  • 深入解析:第二章:BI的原理与技术架构
  • 完整教程:Video-of-Thought论文阅读
  • 【第五章:计算机视觉-项目实战之生成式算法实战:扩散模型】2.CV黑科技:生成式算法理论-(2)扩散模型背后的数学原理 - 详解
  • 数据结构:从零开始掌握二叉树(2)二叉树的顺序存储-堆 - 教程
  • 2025年牛大力养生酒选品指南:广东醉王侯,醉王侯牛大力酒业/牛大力养生酒加盟/广东牛大力养生酒加盟/醉王侯牛大力酒加盟/五星推荐的健康之选
  • Python的`__call__`方法:让对象变成“可调用函数”
  • 2025评价高的PFA管阀接头厂家供应商推荐榜:江盛达,国产力量崛起,精准匹配高端制造需求,最好的PFA管接头厂家推荐