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


相关推荐: 如何在腾讯云免费申请建站?  JavaScript常见的五种数组去重的方式  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何在阿里云完成域名注册与建站?  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何实现用户密码重置功能?(完整流程代码)  在centOS 7安装mysql 5.7的详细教程  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  JS碰撞运动实现方法详解  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  高端云建站费用究竟需要多少预算?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  实例解析Array和String方法  iOS发送验证码倒计时应用  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  详解jQuery中的事件  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel如何生成URL和重定向?(路由助手函数)  网站建设要注意的标准 促进网站用户好感度!  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Swift开发中switch语句值绑定模式  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  油猴 教程,油猴搜脚本为什么会网页无法显示?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何用PHP快速搭建高效网站?分步指南  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel Docker环境搭建教程_Laravel Sail使用指南  使用豆包 AI 辅助进行简单网页 HTML 结构设计  WordPress 子目录安装中正确处理脚本路径的完整指南  iOS UIView常见属性方法小结  网站制作软件有哪些,制图软件有哪些?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  Linux系统命令中screen命令详解  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  jQuery validate插件功能与用法详解  WEB开发之注册页面验证码倒计时代码的实现  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】