这次给大家带来html5联合canvas实现图片压缩,主要以代码的形式体现,下面就是实战案例,一起来看一下。
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1'>
<title>lianxi </title>
<style type="text/css">
</style>
</head>
<body>
<form>
名字:<input type="text " name = 'username' id = 'username'/>
上传:<input type="file" name = 'fileimage' id = 'fileimage' />
</form>
<button>button</button>
<script>
var file = document.queryselector('#fileimage')
var username = document.queryselector('#username')
var canvas = document.createelement('canvas');
var span = document.createelement('span')
var formdata = new formdata()
file.addeventlistener('change',function() {
//实现的原理的new formdata()然后把这个formdata 用ajax传进去
span.innerhtml = '预览图加载中...'
document.body.appendchild(span)
console.log(file.files[0])
username.value ? formdata.append('username',username.value) : null;
resize(file.files[0]);
})
//上传前的图片压缩
function resize(file) {
var reader = new filereader()
reader.readasdataurl(file)
var img = new image()
reader.onload = function (e) {
// this.result就是图片的base64地址信息
img.src = this.result;
}
var context = canvas.getcontext('2d');
var gif = document.createelement('img')
// base64地址图片加载完毕后
img.onload = function () {
// 图片原始尺寸
//定义画布的大小
if (img.width > 300 || img.height > 300) {
if (img.width > img.height) {
canvas.width = 300
canvas.height = img.height / img.width * 300
}
else {
canvas.height = 300
canvas.width = img.width / img.height * 300
}
}
//从那里开始截取图片
context.drawimage(img, 0, 0, canvas.width, canvas.height)
/*第一个参数是创建的img对象;第二个参数是左上角坐标,后面两个是画布区域宽高*/
//压缩后的图片base64 url
/*canvas.todataurl(mimetype, qualityargument),mimetype 默认值是'image/jpeg';
* qualityargument表示导出的图片质量,只要导出为jpg和webp格式的时候此参数才有效果,默认值是0.92*/
//var newurl = canvas.todataurl('image/jpeg', 0.92);//base64 格式
document.body.removechild(span)
document.queryselector('body').appendchild(canvas)
};
}
//这是上传的
document.queryselector('button').addeventlistener('click',function(){
canvas.toblob(function(blob){
var xhr = new xmlhttprequest()
formdata.append('fileimage', blob,'002.webp')
xhr.open('post', 'test.php', true)//默认true 为异步
//上传进度
xhr.upload.addeventlistener('progress',function (e) {
console.log('上传进度为:'+ (e.loaded/e.total*100).tofixed(2)+'%')//多次出现
// event.total是需要传输的总字节,event.loaded是已经传输的字节
})
xhr.upload.addeventlistener('loadstart', function () {
console.log('上传开始')//只出现一次
})
xhr.onreadystatechange = function () {
if (xhr.readystate === 4) {
if (xhr.status >= 200 && xhr.status <300 || xhr.status == 304) {
console.log(json.parse(xhr.responsetext))//成功后的返回值
}
else {
console.log("request was unsuccessful: " + xhr.status);
}
}
}
//xhr.setrequestheader("content-type", "multipart/form-data");
xhr.send(formdata)
}, 'image/webp',0.9)
})
</script>
</body>
</html>
需要注意的是后端需要加上header(access-control-allow-origin:*);以实现跨域
相关链接:
html5+canvas实现图片的压缩上传
html5 canvas 实现本地压缩图片
html5 canvas实现图片拉伸、压缩与裁剪
以上就是html5联合canvas实现图片压缩的详细内容。