# 技术栈

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)

<div class="cont">
<div class="uploadBtn">选择图片<input name="file" accept="image/png, image/jpeg" multiple type="file" id="file"></div>
<br>
<br>
<div class="selectbox">
<div>请选择压缩质量</div>
<select id="encoderOptions">
<option value="0.1">10%</option>
<option value="0.2">20%</option>
<option value="0.3">30%</option>
<option value="0.4">40%</option>
<option value="0.5" selected>50%</option>
<option value="0.6">60%</option>
<option value="0.7">70%</option>
<option value="0.8">80%</option>
<option value="0.9">90%</option>
<option value="1">100%</option>
</select>
</div>
<br>
<div id="show">
<br>
<br>
需要压缩的图片:
<br>
<br>
<ul id="selectView"></ul>
<br>
</div>
<div id="compressBox">
<button id="active" onclick="startCompress()">压缩图片并下载</button>
</div>
</div>
<canvas id="canvas"></canvas>

直接解读源码:(js)

<!-- 网页端压缩解压缩插件JSZIP库 -->
<script src="jszip.min.js"></script>
<!-- 文件保存到本地库 -->
<script src="FileSaver.js"></script>
<!--用于文件下载-->
<script>
// 图片质量(0-1)
var encoderOptions = 0.5;
// 获取input
var filesInput = document.querySelector('#file')
// 获取压缩按钮
var compressBox = document.querySelector('#compressBox')
// 选择图片展示视口
var selectView = document.querySelector('#selectView')
// 获取选择图片后展示的视口
var show = document.querySelector('#show')
var encoderOptionInput = document.querySelector('#encoderOptions')
// 所有的选择文件
var files;
var canvas;
var ctx;
// new JSZip对象
var zip = new JSZip();
// 创建images文件夹,用来存在压缩完成的图片
var imgFolder = zip.folder("images");
// 监听input选择文件的变化
filesInput.onchange = function() {
// 获取所有file
files = filesInput.files
// 如果选择files数量大于0就显示压缩操作
if (files.length > 0) {
show.style.display = 'block'
compressBox.style.display = 'block'
}
// 拼接缩略图列表
var html = ''
for (var i = 0; i < files.length; i++) {
html += '<li>[外链图片转存失败(img-Yusvt3iA-1562061874770)(https://mp.csdn.net/mdeditor/'%20+%20getObjectURL(files[i])]%20+%20')</li>'
}
// 插入拼接的图片列表
selectView.innerHTML = html
}
// 压缩图片的方法
function startCompress() {
demo(files[0], 0)
}
// 利用递归循环files
function demo(file, num) { if (num <= files.length - 1) {
encoderOptions = parseFloat(encoderOptionInput.value)
// 获取file的base64地址
var imgsrc = getObjectURL(file)
// 获取文件名称
var name = file.name
// 监听如果转换base64地址成功,就执行下面的
if (imgsrc) {
// 创建image,并动态复制src
var img = new Image()
img.src = imgsrc
// 监听img图片加载完成
img.onload = () => {
// 获取canvas标签
canvas = document.querySelector('#canvas')
// 获取上下文
ctx = canvas.getContext('2d')
// 根据图片宽高设置canvas的宽高
canvas.width = img.width
canvas.height = img.height
// 在canvas上面画图片
ctx.drawImage(img, 0, 0, img.width, img.height);
// 把canvas转成路径
// canvas.toDataURL(type, encoderOptions);
// 参数
// type 可选
// 图片格式, 默认为image / png
// encoderOptions 可选
// 图片质量。 取值范围为0到1。 如果指定图片格式为image / jpeg或image / webp。 如果超出取值范围, 将会使用默认值0 .92。 其他参数会被忽略。
var typeTxt = 'image/jpeg'
if (name.indexOf('png') != -1) {
typeTxt = 'image/png'
}
var imgdata = canvas.toDataURL(typeTxt, encoderOptions)
// 分割base64
imgdata = imgdata.split(',')
// 添加图片到文件夹
imgFolder.file(name, imgdata[1], { base64: true });
// 如果当前的标记和文件的数量相等的话,就说明压缩添加到文件到文件夹已经完成了,可以压缩下载了。
if (num == files.length - 1) {
zip.generateAsync({ type: "blob" })
.then(function(content) {
// 创建的zip的文件名称是images
saveAs(content, "images.zip");
location.reload()
});
} else {
// 如果没有到标记,就继续回调
num++
demo(files[num], num)
}
}
}
}
}
// 获取file 的base64路径
function getObjectURL(file) {
var url = null;
if (window.createObjectURL != undefined) {
url = window.createObjectURL(file);
} else if (window.URL != undefined) { // mozilla(firefox)
url = window.URL.createObjectURL(file);
} else if (window.webkitURL != undefined) { // webkit or chrome
url = window.webkitURL.createObjectURL(file);
}
return url;
}
</script>

直接解读源码:(css)

<style>
*{
padding: 0;
margin: 0;
background-color: #000;
color: #DC143C;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
user-select: none;
}
html,body{
overflow: hidden;
padding: 20px;
box-sizing: border-box;
}
h3{
text-align: center;
}
#compressBox{
display: none;
}
#canvas{
position: fixed;
top: -100000px;
left: -100000px;
opacity: 0;
}
.cont{
margin-top: 20px;
padding: 20px;
box-sizing: border-box;
border: 1px solid #DC143C;
border-radius: 10px;
background-color: #fff;
font-size: 13px;
min-height: 80px;
}
.uploadBtn{
position: relative;
display: inline-block;
padding: 0 20px;
line-height: 28px;
background-color: #fff;
border: 1px solid #DC143C;
font-size: 12px;
border-radius: 30px;
text-align: center;
cursor: pointer;
width: 300px;
}
.uploadBtn input{
opacity: 0;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
#selectView{
background-color: #fff;
}
#selectView li{
background-color: #fff;
display: inline-block;
margin-right: 10px;
}
#compressBox{
height: 60px;
background-color: #fff;
}
#active{
position: absolute;
left: 50%;
transform: translateX(-50%);
display: block;
padding: 0 20px;
line-height: 28px;
background-color: #DC143C;
border: 1px solid #DC143C;
font-size: 12px;
border-radius: 30px;
text-align: center;
cursor: pointer;
width: 300px;
color: #fff;
}
#show{
display: none;
background-color: #fff;
}
.help{
position: fixed;
font-size: 12px;
bottom: 20px;
left: 0;
text-align: center;
width: 100%;
}
.selectbox{
background-color: #fff;
display: -webkit-flex;
display: -moz-flex;
display: -ms-flex;
display: -o-flex;
display: flex;
}
.selectbox input,.selectbox div,.selectbox select{
background-color: #fff;
}
.selectbox div{
padding-right: 20px;
}
</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. 策略路由PBR(不含track)

    策略路由:是一种依据用户制定的策略进行路由选择的机制.(公义)在特定数据进入路由表前,对其进行操控的方式.(本人定义) 根据作用对象的不同,策略路由可分为本地策略路由和接口策略路由: · 本地策略路由 ...

  2. jQuery 源码分析(十五) 数据操作模块 val详解

    jQuery的属性操作模块总共有4个部分,本篇说一下最后一个部分:val值的操作,也是属性操作里最简单的吧,只有一个API,如下: val(vlaue)        ;获取匹配元素集合中第一个元素的 ...

  3. redis集群之Cluster

    RedisCluster 是 Redis 的亲儿子,它是 Redis 作者自己提供的 Redis 集群化方案. 相对于 Codis 的不同,它是去中心化的,如图所示,该集群有三个 Redis 节点组成 ...

  4. hyper-v Centos7 网卡配置无效

    环境: Win 10 Hyper-v 安装虚拟机:Centos 7 遇到问题: 网络配置无效,使用命令“ip addr” 网卡没有出现在列表中,显示了一个奇怪的网卡名字如“enp0s010f”,配置文 ...

  5. 只想听歌曲的高潮部分?让我用python来教你做个音乐高潮提取器!

    有些时候,我们为了设定手机铃声或者发抖音视频时,会耗费大量时间在音乐剪辑上.尤其是想发布大量抖音视频的时候,我们得收集大量的短音乐,这是一个相当耗费时间的工作.那么,这个音乐高潮的提取能不能自动化呢? ...

  6. SpringCloud之API网关与服务发现——Cloud核心组件实战入门及原理

    微服务发展历史 单体模式——>服务治理(服务拆分)——>微服务(细分服务)——>Segments(服务网格) 微服务 VS SOA 微服务:模块化.独立部署.异构化 SOA:共同的治 ...

  7. C++ 流插入"<<"和流提取">>"运算符的重载

    01 流插入<<运算符的重载 C++ 在输出内容时,最常用的方式: std::cout << 1 <<"hello"; 问题: 那这条语句为什么 ...

  8. CSS3 过渡---transition

    过渡(transition)是CSS3中具有颠覆性的特征之一,我们可以在不使用 Flash 动画或 JavaScript 的情况下,当元素从一种样式变换为另一种样式时为元素添加效果. 过渡动画: 是从 ...

  9. arcgis api for javascript 学习(二) 发布并调用地图切片

    文章将从发布切片地图到调用切片地图整个过程都展示出来. (一).切片地图的发布 1.还是前面的arcgis展示的地图 2.与发布动态地图前面的步骤是一样的 打开分享后,如图 3.一切就绪后,到达缓存的 ...

  10. 实验吧简单的SQL注入1,简单的SQL注入

    接上面一篇博客. 实验吧简单的sql注入1 题目连接   http://ctf5.shiyanbar.com/423/web/ 同样,直接输入 1加个但引号,结果下面有返回错误,            ...