Canvas与图片压缩的示例代码


Posted in HTML / CSS onNovember 28, 2017

之前写过一篇有关Canvas图片处理的文章,今天我们讲讲如何使用Canvas来压缩图片。

Canvas图片压缩流程

Canvas与图片压缩的示例代码

接下来我将以具体实例为大家讲解Canvas图片压缩的具体流程。

一、本地图片输入

1. 获取本地文件

<!--HTML-->
<input type="file" id="choose-img" />
// JS
var chooseImg = document.getElementById("choose-img");
chooseImg.onchange = function(e){
    var file = this.files[0];
    // ……  (省略部分代码后续依次展示,下同)
};

很简单,就是通过type类型为file的按钮来获取本地文件。

2. 判断所获取的本地文件类型

<!--HTML-->
<div id="result"></div>
// JS
var result = document.getElementById("result");    // 用于显示图片输出结果,或者错误提示
if(/image/.test(file.type)){     // 判断文件类型是否为图片
    // ……
}
else{
    result.innerHTML = '<span style="color: red;">文件类型有误!</span>';
}

3. 将所获取的本地图片以base64格式输出

var img = new Image(),      // 创建图片对象,用于放置原始图片
    reader = new FileReader();
reader.readAsDataURL(file);    // 以base64格式读取并存入FileReader对象的result属性中
reader.onload = function(){
    img.src = this.result;   // 将图片base64字符串直接赋予Image对象的src中
    document.body.insertBefore(img,chooseImg);   // 将输出的图片插入到文件按钮之前
    img.onload = function(){
        // ……
    };
};

二、在Canvas画布中绘制图片

1. 创建画布

var canvas = document.createElement('canvas');
canvas.width = img.clientWidth;
canvas.height = img.clientHeight;
var context = canvas.getContext('2d');

注意:画布大小与所输入图片宽高相同。

2. 绘制图片

context.drawImage(img,0,0,canvas.width,canvas.height);

三、压缩图片并输出

<!--HTML-->
图片压缩比率 : <input id="rate" type="number" min="0" max="100" /> %
// JS
var rate = document.getElementById("rate").value || 100;   // 输入图片压缩比率,默认为100%
var imgUrl = canvas.toDataURL(file.type,rate/100);   // 第一个参数为输出图片类型,第二个为压缩比
result.innerHTML = '压缩后:<img src="'+ imgUrl +'" />';     // 将压缩后的图片置于result中显示
img.style.display = 'none';   // 将原始图片隐藏

将在Canvas画布中所绘制的图片再次以base64格式输出。

四、完整代码展示

<!--HTML-->
图片压缩比率 : <input id="rate" type="number" min="0" max="100" /> %
<input type="file" id="choose-img" />
<div id="result"></div>
// JS
var chooseImg = document.getElementById("choose-img"),
    result = document.getElementById("result");
chooseImg.onchange = function(e){
    var file = this.files[0];
    if(/image/.test(file.type)){
        var img = new Image(),
            reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = function(){
            img.src = this.result;
            document.body.insertBefore(img,chooseImg);
            img.onload = function(){
                var canvas = document.createElement('canvas');
                canvas.width = img.clientWidth;
                canvas.height = img.clientHeight;
                var context = canvas.getContext('2d');
                context.drawImage(img,0,0,canvas.width,canvas.height);
                var rate = document.getElementById("rate").value || 100;
                var imgUrl = canvas.toDataURL(file.type,rate/100);
                result.innerHTML = '压缩后:<img src="'+ imgUrl +'" />';
                result.style.display = 'block';
                img.style.display = 'none';
            };
        };
    }
    else{
        result.innerHTML = '<span style="color: red;">文件类型有误!</span>';
    }
};

经测试发现,通过Canvas压缩JPEG格式图片效果最佳,PNG压缩效果不明显,有时反而变得更大。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
CSS3教程(1):什么是CSS3
Apr 02 HTML / CSS
CSS3之边框多颜色Border-color属性使用示例
Oct 11 HTML / CSS
一款纯css3实现的漂亮的404页面的实例教程
Nov 27 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
Mar 12 HTML / CSS
html5使用canvas画一条线
Dec 15 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
Jan 01 HTML / CSS
解决canvas转base64/jpeg时透明区域变成黑色背景的方法
Oct 23 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
Oct 16 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
Jan 03 HTML / CSS
html5自动播放mov格式视频的实例代码
Jan 14 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
Sep 16 HTML / CSS
CSS子盒子水平和垂直居中的五种方法
Jul 23 HTML / CSS
教你使用Canvas处理图片的方法
Nov 28 #HTML / CSS
HTML5打开手机扫码功能及优缺点
Nov 27 #HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
Nov 21 #HTML / CSS
HTML5响应式(自适应)网页设计的实现
Nov 17 #HTML / CSS
localStorage、sessionStorage使用总结
Nov 17 #HTML / CSS
html5实现移动端适配完美写法
Nov 16 #HTML / CSS
关于h5中的fetch方法解读(小结)
Nov 15 #HTML / CSS
You might like
十天学会php之第七天
2006/10/09 PHP
adodb与adodb_lite之比较
2006/12/31 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
php操作redis命令及代码实例大全
2020/11/19 PHP
简单JS代码压缩器
2006/10/12 Javascript
js innerHTML 的一些问题的解决方法
2008/06/22 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
jQuery.event兼容各浏览器的event详细解析
2013/12/18 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
js+h5 canvas实现图片验证码
2020/10/11 Javascript
python中Genarator函数用法分析
2015/04/08 Python
简介Django框架中可使用的各类缓存
2015/07/23 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
解决Python中list里的中文输出到html模板里的问题
2018/12/17 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
IntelliJ 中配置 Anaconda的过程图解
2020/06/01 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
主持人演讲稿范文
2013/12/28 职场文书
玲玲的画教学反思
2014/02/04 职场文书
《口技》教学反思
2014/02/21 职场文书
治安消防安全责任书
2014/07/23 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书