# 技术栈

canvas
jszip.js(网页端压缩解压缩插件JSZIP库)
FileSaver.js(文件保存到本地库)

在线预览:http://htmlpreview.github.io/?https://github.com/xiaoqiuxiong/imageCompressionTool/master/index.html

github: https://github.com/xiaoqiuxiong/imageCompressionTool

解读

  • 以上的工具,暂时只是配置了允许png和jpg格式的图片压缩,如需别的格式的请自行到我的github上面clone下载自行修改;
  • 压缩质量:10份;
  • 压缩会自动打包成zip,自行下载解压,压缩速度惊人。
  • 压缩速度我觉得比熊猫压缩牛逼。

工具预览

直接解读源码:(html)

  1. <div class="cont">
  2. <div class="uploadBtn">选择图片<input name="file" accept="image/png, image/jpeg" multiple type="file" id="file"></div>
  3. <br>
  4. <br>
  5. <div class="selectbox">
  6. <div>请选择压缩质量</div>
  7. <select id="encoderOptions">
  8. <option value="0.1">10%</option>
  9. <option value="0.2">20%</option>
  10. <option value="0.3">30%</option>
  11. <option value="0.4">40%</option>
  12. <option value="0.5" selected>50%</option>
  13. <option value="0.6">60%</option>
  14. <option value="0.7">70%</option>
  15. <option value="0.8">80%</option>
  16. <option value="0.9">90%</option>
  17. <option value="1">100%</option>
  18. </select>
  19. </div>
  20. <br>
  21. <div id="show">
  22. <br>
  23. <br>
  24. 需要压缩的图片:
  25. <br>
  26. <br>
  27. <ul id="selectView"></ul>
  28. <br>
  29. </div>
  30. <div id="compressBox">
  31. <button id="active" onclick="startCompress()">压缩图片并下载</button>
  32. </div>
  33. </div>
  34. <canvas id="canvas"></canvas>

直接解读源码:(js)

  1. <!-- 网页端压缩解压缩插件JSZIP库 -->
  2. <script src="jszip.min.js"></script>
  3. <!-- 文件保存到本地库 -->
  4. <script src="FileSaver.js"></script>
  5. <!--用于文件下载-->
  6. <script>
  7. // 图片质量(0-1)
  8. var encoderOptions = 0.5;
  9. // 获取input
  10. var filesInput = document.querySelector('#file')
  11. // 获取压缩按钮
  12. var compressBox = document.querySelector('#compressBox')
  13. // 选择图片展示视口
  14. var selectView = document.querySelector('#selectView')
  15. // 获取选择图片后展示的视口
  16. var show = document.querySelector('#show')
  17. var encoderOptionInput = document.querySelector('#encoderOptions')
  18. // 所有的选择文件
  19. var files;
  20. var canvas;
  21. var ctx;
  22. // new JSZip对象
  23. var zip = new JSZip();
  24. // 创建images文件夹,用来存在压缩完成的图片
  25. var imgFolder = zip.folder("images");
  26. // 监听input选择文件的变化
  27. filesInput.onchange = function() {
  28. // 获取所有file
  29. files = filesInput.files
  30. // 如果选择files数量大于0就显示压缩操作
  31. if (files.length > 0) {
  32. show.style.display = 'block'
  33. compressBox.style.display = 'block'
  34. }
  35. // 拼接缩略图列表
  36. var html = ''
  37. for (var i = 0; i < files.length; i++) {
  38. html += '<li>[外链图片转存失败(img-Yusvt3iA-1562061874770)(https://mp.csdn.net/mdeditor/'%20+%20getObjectURL(files[i])]%20+%20')</li>'
  39. }
  40. // 插入拼接的图片列表
  41. selectView.innerHTML = html
  42. }
  43. // 压缩图片的方法
  44. function startCompress() {
  45. demo(files[0], 0)
  46. }
  47. // 利用递归循环files
  48. function demo(file, num) {
  49. if (num <= files.length - 1) {
  50. encoderOptions = parseFloat(encoderOptionInput.value)
  51. // 获取file的base64地址
  52. var imgsrc = getObjectURL(file)
  53. // 获取文件名称
  54. var name = file.name
  55. // 监听如果转换base64地址成功,就执行下面的
  56. if (imgsrc) {
  57. // 创建image,并动态复制src
  58. var img = new Image()
  59. img.src = imgsrc
  60. // 监听img图片加载完成
  61. img.onload = () => {
  62. // 获取canvas标签
  63. canvas = document.querySelector('#canvas')
  64. // 获取上下文
  65. ctx = canvas.getContext('2d')
  66. // 根据图片宽高设置canvas的宽高
  67. canvas.width = img.width
  68. canvas.height = img.height
  69. // 在canvas上面画图片
  70. ctx.drawImage(img, 0, 0, img.width, img.height);
  71. // 把canvas转成路径
  72. // canvas.toDataURL(type, encoderOptions);
  73. // 参数
  74. // type 可选
  75. // 图片格式, 默认为image / png
  76. // encoderOptions 可选
  77. // 图片质量。 取值范围为0到1。 如果指定图片格式为image / jpeg或image / webp。 如果超出取值范围, 将会使用默认值0 .92。 其他参数会被忽略。
  78. var typeTxt = 'image/jpeg'
  79. if (name.indexOf('png') != -1) {
  80. typeTxt = 'image/png'
  81. }
  82. var imgdata = canvas.toDataURL(typeTxt, encoderOptions)
  83. // 分割base64
  84. imgdata = imgdata.split(',')
  85. // 添加图片到文件夹
  86. imgFolder.file(name, imgdata[1], { base64: true });
  87. // 如果当前的标记和文件的数量相等的话,就说明压缩添加到文件到文件夹已经完成了,可以压缩下载了。
  88. if (num == files.length - 1) {
  89. zip.generateAsync({ type: "blob" })
  90. .then(function(content) {
  91. // 创建的zip的文件名称是images
  92. saveAs(content, "images.zip");
  93. location.reload()
  94. });
  95. } else {
  96. // 如果没有到标记,就继续回调
  97. num++
  98. demo(files[num], num)
  99. }
  100. }
  101. }
  102. }
  103. }
  104. // 获取file 的base64路径
  105. function getObjectURL(file) {
  106. var url = null;
  107. if (window.createObjectURL != undefined) {
  108. url = window.createObjectURL(file);
  109. } else if (window.URL != undefined) { // mozilla(firefox)
  110. url = window.URL.createObjectURL(file);
  111. } else if (window.webkitURL != undefined) { // webkit or chrome
  112. url = window.webkitURL.createObjectURL(file);
  113. }
  114. return url;
  115. }
  116. </script>

直接解读源码:(css)

  1. <style>
  2. *{
  3. padding: 0;
  4. margin: 0;
  5. background-color: #000;
  6. color: #DC143C;
  7. -webkit-touch-callout: none;
  8. -webkit-user-select: none;
  9. -khtml-user-select: none;
  10. -moz-user-select: none;
  11. user-select: none;
  12. }
  13. html,body{
  14. overflow: hidden;
  15. padding: 20px;
  16. box-sizing: border-box;
  17. }
  18. h3{
  19. text-align: center;
  20. }
  21. #compressBox{
  22. display: none;
  23. }
  24. #canvas{
  25. position: fixed;
  26. top: -100000px;
  27. left: -100000px;
  28. opacity: 0;
  29. }
  30. .cont{
  31. margin-top: 20px;
  32. padding: 20px;
  33. box-sizing: border-box;
  34. border: 1px solid #DC143C;
  35. border-radius: 10px;
  36. background-color: #fff;
  37. font-size: 13px;
  38. min-height: 80px;
  39. }
  40. .uploadBtn{
  41. position: relative;
  42. display: inline-block;
  43. padding: 0 20px;
  44. line-height: 28px;
  45. background-color: #fff;
  46. border: 1px solid #DC143C;
  47. font-size: 12px;
  48. border-radius: 30px;
  49. text-align: center;
  50. cursor: pointer;
  51. width: 300px;
  52. }
  53. .uploadBtn input{
  54. opacity: 0;
  55. position: absolute;
  56. top: 0;
  57. left: 0;
  58. width: 100%;
  59. height: 100%;
  60. cursor: pointer;
  61. }
  62. #selectView{
  63. background-color: #fff;
  64. }
  65. #selectView li{
  66. background-color: #fff;
  67. display: inline-block;
  68. margin-right: 10px;
  69. }
  70. #compressBox{
  71. height: 60px;
  72. background-color: #fff;
  73. }
  74. #active{
  75. position: absolute;
  76. left: 50%;
  77. transform: translateX(-50%);
  78. display: block;
  79. padding: 0 20px;
  80. line-height: 28px;
  81. background-color: #DC143C;
  82. border: 1px solid #DC143C;
  83. font-size: 12px;
  84. border-radius: 30px;
  85. text-align: center;
  86. cursor: pointer;
  87. width: 300px;
  88. color: #fff;
  89. }
  90. #show{
  91. display: none;
  92. background-color: #fff;
  93. }
  94. .help{
  95. position: fixed;
  96. font-size: 12px;
  97. bottom: 20px;
  98. left: 0;
  99. text-align: center;
  100. width: 100%;
  101. }
  102. .selectbox{
  103. background-color: #fff;
  104. display: -webkit-flex;
  105. display: -moz-flex;
  106. display: -ms-flex;
  107. display: -o-flex;
  108. display: flex;
  109. }
  110. .selectbox input,.selectbox div,.selectbox select{
  111. background-color: #fff;
  112. }
  113. .selectbox div{
  114. padding-right: 20px;
  115. }
  116. </style>

使用方法:

github: https://github.com/xiaoqiuxiong/imageCompressionTool

直接Git克隆下来,然后浏览器(最好使用谷歌浏览器)打开idnex.html页面,即刻轻松使用了。

以后都可以使用了,再也不用用什么熊猫压缩了。

一键压缩,就是吊!

好用的话,记得加星。

前端实现的canvas支持多图压缩并打包下载的工具的更多相关文章

  1. 全网唯一的纯前端实现的canvas支持多图压缩并打包下载的工具

    技术栈: canvas jszip.js(网页端压缩解压缩插件JSZIP库) FileSaver.js(文件保存到本地库) 直接解读源码: <div class="cont" ...

  2. 前端JS利用canvas的drawImage()对图片进行压缩

    对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验. 这种体验包括两方面: 1.由于上传图片尺寸比较小,因此上传速度会比较快,交互会更加流畅,同时大大降低了网络异常导致 ...

  3. linux压缩、解压缩和归档工具

    linux基础之压缩.解压缩和归档工具 1.压缩工具 基本介绍 为了减少文件的原来的文件大小而过多的浪费磁盘的存储空间,我们使用压缩后多文件进行存储 压缩工具的介绍 compress:把文件压缩成以. ...

  4. 使用Canvas绘制背景图

    原文  http://www.imququ.com/post/use-canvas-as-background-image.html 最近iCloud Web的Beta版换了UI,整体风格变得和iOS ...

  5. 使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器

    使用ajax上传图片,支持图片即时浏览,支持js图片压缩后上传给服务器 ajax上传主要使用了 var reader = new FileReader() 此方法 js图片压缩主要是利用canvas进 ...

  6. 前端笔记之Canvas

    一.Canvas基本使用 Canvas是HTML5的画布,Canvas算是“不务正业”的面向对象大总结,将面向对象玩极致. 算法为王!就是说canvas你不会,但是算法好,不怕写业务,不怕代码量,只要 ...

  7. 网页图片提取助手(支持背景图、选择dom范围)

    网页图片提取助手(支持背景图.选择dom范围) 网页图片下载工具.网页图片批量保存. 使用场景: 作为web前端开发首——学习小生的你我,仿学在线页面是常有的事,但是一些在线资源,比如图片,图片有im ...

  8. 用canvas绘制折线图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. NGUI字体贴图压缩以及相关Shader解读

    一般游戏中,字体贴图是游戏贴图压缩的一个重点,特别是对于中文的游戏.考虑的字体贴图的特殊性,一般我们输出的字体贴图是不含颜色信息的,所以正常情况下,我们输出的字体贴图RGBA每一个通道都是一样的.这样 ...

随机推荐

  1. 有了faker,再也不用为了构造测试数据而烦恼啦!

    在软件需求.开发.测试过程中,有时候需要使用一些测试数据,针对这种情况,我们一般要么使用已有的系统数据,要么需要手动制造一些数据.在手动制造数据的过程中,可能需要花费大量精力和工作量,此时可以借助Py ...

  2. Javascript模块化开发1——package.json详解

    一.环境安装 Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/. 在该页面你可以根据不同平台系统选择你需要的 Node.js 安装包. Node. ...

  3. Drools规则引擎-如果Fact对象参数为null如何处理

    问题场景 在技术交流群(QQ:715840230)中有同学提出这样的问题: 往kiesession里面传入fact,如果不做输入检查fact里面有些字段可能是null值.但是如果在外面做输入检查,规则 ...

  4. 链表中删除倒数第K个节点

    问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如 ...

  5. windows环境下安装配置MongoDB

    版本选择MongoDB的版本命名规范如:x.y.z: y为奇数时表示当前版本为开发版,如:2.3.0.2.1.1: y为偶数时表示当前版本为稳定版,如:2.0.1.2.2.0: 目前官网上最新的版本为 ...

  6. Winform中在ZedGraph中最多可以添加多少条曲线

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  7. Oracle 12c报错:ORA-01078和LRM-00109的解决办法

    Oracle 12c报错:ORA-01078和LRM-00109的解决办法 2017-12-17 10:25:30 lemon_love1 阅读数 4336  收藏 更多 分类专栏: oracle   ...

  8. MySQL 同一Windows系统上安装多个数据库

    Step 1:拷贝一份MySQL整个安装文件,并拷贝一份 my.ini 文件放置安装目录下,然后修改以下内容.注意 port 不能设置为默认的3306,这里我们设置为3307端口. basedir=C ...

  9. c# 第21节 方法声明和调用

    本节内容: 1:为什么要有方法 2:方法的声明及使用 3:方法params 传入接收数组 4:值传递和引用传递 5:输出参数out 1:为什么要有方法 2:方法的声明及使用 声明实例: 3:方法par ...

  10. Requests text乱码

    都在推荐用Requests库,而不是Urllib,但是读取网页的时候中文会出现乱码. 分析: r = requests.get(“http://www.baidu.com“) **r.text返回的是 ...