网站首页 > 技术文章 正文
整个过程用到了画布(canvas)来帮忙完成
过程: 选择图片文件 > 准备画布 > 按需压缩图片并绘制在画布上 > 生成Base64 > 完成.
先上效果图
详细过程如下:
准备一个简洁的HTML文件, 代码如下
用一个file dom来选择图片文件
<!DOCTYPE html>
<html lang="zh-CN">
<script type="text/javascript" src="../js/jquery.min.js"></script>
<body>
<input name="file" id="thumbnail" type="file" onchange="previewPic(this)"
accept="image/x-png, image/jpg, image/jpeg, image/gif" />
</body>
</html>
为了方便后面的代码操作, 引用了JQuery
然后准备2个容器, 一个放预览图; 另一个放Base64内容
<div>下面这个Div用来预览图片</div>
<div id="showpic" style="padding:7px;"></div>
<div>下面这个Div用来存放Base64内容</div>
<div id="picb64"></div>
接下来是灵魂:JS代码
function previewPic(tis) {
var fileObj = tis.files[0]; //获取图片文件对象
if (undefined == fileObj) { console.log("未选择待上传的文件"); return; }
var picid = "imgComp";
$("<img>", {
id: picid,
}).appendTo($("#showpic")); //先生成IMG的DOM,以防顺序乱掉
genCompPic(picid, fileObj);
}
function genCompPic(picid, fileObj) {
var ready = new FileReader();
/*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
ready.readAsDataURL(fileObj);
ready.onload = function () {
canvasDataURL(this.result, { width: 200 }, function (base64Codes) {
$("#"+ picid).attr("src", base64Codes); //在IMG DOM中显示图片预览
$("#picb64").html(base64Codes); //得到Base64结果,填充到Div中显示
})
}
}
//利用canvas生成压缩后的图片
function canvasDataURL(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function () {
var w = obj.width;
var h = obj.width / (this.width/ this.height); //按比例压缩,计算出等比例高
var canvas = document.createElement('canvas'); //生成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(this, 0, 0, w, h); //绘制图片
var quality = 1; // 图片质量为0.1~1, quality值越小,所绘制出的图像越模糊
var base64 = canvas.toDataURL('image/jpeg', quality); //利用canvas生成Base64
callback(base64); // 回调函数返回base64的值
}
}
虽然有点长, 不过关键位置都写上注释了, 大家可以参考使用
如果不想压缩图片, 在canvasDataURL方法里可以把设置宽和高的代码换成原图参数即可
完整代码
<!DOCTYPE html>
<html lang="zh-CN">
<script type="text/javascript" src="../js/jquery.min.js"></script>
<style>
#picb64{width: 95%;height: 300px;overflow-wrap: break-word;overflow: auto;margin: auto;background-color: #676767;border-radius: 10px;}
</style>
<body>
<input name="file" id="thumbnail" type="file" onchange="previewPic(this)"
accept="image/x-png, image/jpg, image/jpeg, image/gif" />
<div>下面这个Div用来预览图片</div>
<div id="showpic" style="padding:7px;"></div>
<div>下面这个Div用来存放Base64内容</div>
<div id="picb64"></div>
<script>
function previewPic(tis) {
var fileObj = tis.files[0]; //获取图片文件对象
if (undefined == fileObj) { console.log("未选择待上传的文件"); return; }
var picid = "imgComp";
$("<img>", {
id: picid,
}).appendTo($("#showpic")); //先生成IMG的DOM,以防顺序乱掉
genCompPic(picid, fileObj);
}
function genCompPic(picid, fileObj) {
var ready = new FileReader();
/*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/
ready.readAsDataURL(fileObj);
ready.onload = function () {
canvasDataURL(this.result, { width: 200 }, function (base64Codes) {
$("#"+ picid).attr("src", base64Codes); //在IMG DOM中显示图片预览
$("#picb64").html(base64Codes); //得到Base64结果,填充到Div中显示
})
}
}
//利用canvas生成压缩后的图片
function canvasDataURL(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function () {
var w = obj.width;
var h = obj.width / (this.width/ this.height); //按比例压缩,计算出等比例高
var canvas = document.createElement('canvas'); //生成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(this, 0, 0, w, h); //绘制图片
var quality = 0.8; // 图片质量为0.1~1, quality值越小,所绘制出的图像越模糊
var base64 = canvas.toDataURL('image/jpeg', quality); //利用canvas生成Base64
callback(base64); // 回调函数返回base64的值
}
}
</script>
</body>
</html>
扩展应用: 可以利用压缩后再上传来节省带宽
本期分享就酱紫, 下期再见[看]
复杂的问题简单化
每次只关注一个知识点
对技术有兴趣的小伙伴可以关注我, 以后会经常分享各种奇奇怪怪又实用的技术知识
- 上一篇: 5个免费好用的开源图片压缩神器,解决你80%的难题
- 下一篇: 医疗行业DCM图片压缩方案
猜你喜欢
- 2024-12-02 Squoosh - 谷歌出品的免费开源图片压缩工具,压缩90%,支持 API 调用
- 2024-12-02 实用技巧分享:你知道如何实现油猴脚本的导出与本地导入吗?
- 2024-12-02 详细介绍一下Spring Boot中对于文件的压缩以及解压缩操作?
- 2024-12-02 前端入门——html 中如何使用图片
- 2024-12-02 超好用 Vue.js 图片裁切组件Vue-ImgCutter
- 2024-12-02 Vue项目优化篇
- 2024-12-02 热门在线图片压缩工具,一次解决平时在办公时遇到的压缩问题
- 2024-12-02 Java pdf下载优化:Java图片压缩
- 2024-12-02 在线图片压缩效果怎么样?有没有免费的工具?
- 2024-12-02 手搓一个TinyPng压缩图片的WebpackPlugin
你 发表评论:
欢迎- 07-08记oracle日志挖掘实操&查询归档不正常增长情况(一)
- 07-08Oracle 伪列!这些隐藏用法你都知道吗?
- 07-08orcl数据库查询重复数据及删除重复数据方法
- 07-08重大故障!业务核心表被truncate删除,准备跑路……
- 07-08oracle数据恢复—oracle执行truncate命令误删除数据的数据恢复
- 07-08Oracle-rac 修改scanip(oracle 修改sequence cache)
- 07-08ORACLE RAC CDB和PDB切换(oracle数据库rac切换)
- 07-08Oracle rac haip作用(oracle rac的典型特征)
- 596℃几个Oracle空值处理函数 oracle处理null值的函数
- 590℃Oracle分析函数之Lag和Lead()使用
- 577℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 573℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 569℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 562℃【数据统计分析】详解Oracle分组函数之CUBE
- 549℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 542℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
-
- 记oracle日志挖掘实操&查询归档不正常增长情况(一)
- Oracle 伪列!这些隐藏用法你都知道吗?
- orcl数据库查询重复数据及删除重复数据方法
- 重大故障!业务核心表被truncate删除,准备跑路……
- oracle数据恢复—oracle执行truncate命令误删除数据的数据恢复
- Oracle-rac 修改scanip(oracle 修改sequence cache)
- ORACLE RAC CDB和PDB切换(oracle数据库rac切换)
- Oracle rac haip作用(oracle rac的典型特征)
- 新手小白怎么学UI设计 推荐学习路线是什么
- 超实用!0基础UI设计自学指南(0基础学ui设计好就业吗)
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端懒加载 (49)
- 前端获取当前时间 (50)
- 前端接口 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)