JS图片压缩(pc端和移动端都适用)

发布时间 - 2026-01-10 22:28:11    点击率:

最近在做移动端遇到了一个问题就是:手机拍照后,图片过大如果上传到服务器务必会浪费带宽,最重要的是流量啊别慌,好事儿来了,务必就会有人去研究研究图片的压缩:

鄙人结合前人的经验,结合自己实战,总结出一个方法供大家参考:

/**
 * 图片压缩,默认同比例压缩
 * @param {Object} path 
 *   pc端传入的路径可以为相对路径,但是在移动端上必须传入的路径是照相图片储存的绝对路径
 * @param {Object} obj
 *   obj 对象 有 width, height, quality(0-1)
 * @param {Object} callback
 *   回调函数有一个参数,base64的字符串数据
 */
function dealImage(path, obj, callback){
 var img = new Image();
 img.src = path;
 img.onload = function(){
  var that = this;
  // 默认按比例压缩
  var w = that.width,
   h = that.height,
   scale = w / h;
   w = obj.width || w;
   h = obj.height || (w / scale);
  var quality = 0.7;  // 默认图片质量为0.7
  //生成canvas
  var canvas = document.createElement('canvas');
  var ctx = canvas.getContext('2d');
  // 创建属性节点
  var anw = document.createAttribute("width");
  anw.nodeValue = w;
  var anh = document.createAttribute("height");
  anh.nodeValue = h;
  canvas.setAttributeNode(anw);
  canvas.setAttributeNode(anh); 
  ctx.drawImage(that, 0, 0, w, h);
  // 图像质量
  if(obj.quality && obj.quality <= 1 && obj.quality > 0){
   quality = obj.quality;
  }
  // quality值越小,所绘制出的图像越模糊
  var base64 = canvas.toDataURL('image/jpeg', quality );
  // 回调函数返回base64的值
  callback(base64);
 }
}

当然返回的是一个base64的一个字符串;

如果可以试着测试一下压缩后的图片大小:

// 调用函数处理图片                 
dealImage("路径", {
// 注意:在pc端可以用绝对路径或相对路径,移动端最好用绝对路径(因为用take photo后的图片路径,我没有试成功(如果有人试成功了可以分享一下经验))
 width : 200
}, function(base){
//直接将获取到的base64的字符串,放到一个image标签中就可看到测试后的压缩之后的样式图了
 document.getElementById("transform").src = base;
 console.log("压缩后:" + base.length / 1024 + " " + base);    
})

PS:主要思想就是获取到图片,利用H5 canvas技术进行图片数据化为 base64 的字符串,最后传到后台进行,后台将base64的字符串数据进行图像化储存。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# JS  # 图片  # 压缩  # JavaScript前端实现压缩图片功能  # JS中图片压缩的方法小结  # js实现上传并压缩图片效果  # 通过js实现压缩图片上传功能  # 如何用JS有效的压缩图片  # js实现纯前端压缩图片  # 如何使用JavaScript对图像进行压缩  # 回调  # 的是  # 来了  # 可以用  # 就可  # 一个问题  # 过大  # 人去  # 试着  # 最重要的是  # 最好用  # 越小  # 有一个  # 按比例  # 测试一下  # 但是在  # 手机拍照  # 就会有  # quality  # callback 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在VPS电脑上快速搭建网站?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  js实现获取鼠标当前的位置  如何快速生成橙子建站落地页链接?  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  JS经典正则表达式笔试题汇总  JS实现鼠标移上去显示图片或微信二维码  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  高性能网站服务器配置指南:安全稳定与高效建站核心方案  手机网站制作与建设方案,手机网站如何建设?  如何在香港服务器上快速搭建免备案网站?  高端网站建设与定制开发一站式解决方案 中企动力  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  如何快速辨别茅台真假?关键步骤解析  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何快速搭建二级域名独立网站?  如何用腾讯建站主机快速创建免费网站?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何使用模型观察者?(Observer代码示例)  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  高端企业智能建站程序:SEO优化与响应式模板定制开发  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么上传文件_Laravel图片上传及存储配置  Laravel怎么调用外部API_Laravel Http Client客户端使用  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  如何在腾讯云服务器上快速搭建个人网站?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  如何在橙子建站中快速调整背景颜色?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何用低价快速搭建高质量网站?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  什么是javascript作用域_全局和局部作用域有什么区别?  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  Laravel如何使用Sanctum进行API认证?(SPA实战)  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Linux系统运维自动化项目教程_Ansible批量管理实战  C语言设计一个闪闪的圣诞树  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何在阿里云服务器自主搭建网站?