Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >用JS压缩上传的图片

用JS压缩上传的图片

作者头像
别盯着我的名字看
发布于 2022-06-09 03:13:17
发布于 2022-06-09 03:13:17
38.2K20
代码可运行
举报
文章被收录于专栏:前端专栏前端专栏
运行总次数:0
代码可运行

现在网上的高清原图尺寸也有好几M甚至更大,而且现在手机像素高了拍出来的照片也特别大,所以有时候需要对用户上传图片时进行压缩处理。

图片压缩的原理:将图片重新画入到canvas画布里面,再将canvas转成图片的形式。

图片压缩js代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function compressedImg(path, callback) {
    var img = new Image();
    img.src = path;
    img.onload = function () {
        var that = this;
        // 默认按比例压缩
        var w = that.width,
            h = that.height;
        // quality值越小,所绘制出的图像越模糊
        var quality = 0.7;  // 默认图片质量为0.7,
        //生成canvas
        var canvas = document.createElement('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(that, 0, 0, w, h);
        var base64 = canvas.toDataURL('image/jpeg', quality);
        // 回调函数返回base64的值
        callback(base64);
    }
}
预览图片及压缩代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>JS图片压缩</title>
</head>
<body>

<input type="file" accept="image/jpg,image/jpeg,image/png" name="file" onchange="selectImg(this)">
<br>
<img id="showImg" src="" alt="" width="">

<script src="jquery-2.1.1.js"></script>
<script>
    function selectImg(file) {
        if (!file.files || !file.files[0]) {
            return;
        }
        //定以一个读取文件的对象
        var reader = new FileReader();
        console.log("图片原始大小:" + file.files[0].size / 1024 + "KB");
        reader.onload = function (evt) {
            //获取的是图片的base64代码
            var replaceSrc = evt.target.result;
            compressedImg(replaceSrc,function (base) {
                document.getElementById("showImg").src = base;
                console.log("压缩后:" + base.length / 1024 + "KB");
            });
            // 再将获取值赋给img标签
            $('#showImg').attr("src", replaceSrc);
        };
        reader.readAsDataURL(file.files[0]);
    }

    //图片压缩代码
    function compressedImg(path, callback) {
        var img = new Image();
        img.src = path;
        img.onload = function () {
            var that = this;
            // 默认按比例压缩
            var w = that.width,
                h = that.height;
            var quality = 0.7;  // 默认图片质量为0.7
            //生成canvas
            var canvas = document.createElement('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(that, 0, 0, w, h);
            // quality值越小,所绘制出的图像越模糊
            var base64 = canvas.toDataURL('image/jpeg', quality);
            // 回调函数返回base64的值
            callback(base64);
        }
    }

</script>

</body>
</html>

因为用canvas画布转化图片是base64代码的形式,上传我们需要转成Blob对象的形式,再上传。

上传压缩图片ajax部分代码:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//dataURL转成Blob对象
function dataURLtoBlob(dataURI) {
    var byteString = atob(dataURI.split(',')[1]);
    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }
    return new Blob([ab], {type: mimeString});
}

//上传
var fd = new FormData();
function upform() {
    var img = $("#showImg").attr("src");
    if (img) {
        var blob = dataURLtoBlob(img);
        fd.append('file', blob);
    }
    $.ajax({
        type: "post",
        url: "假装有接口",
        data: fd,
        dataType: "json",
        async: false,
        processData: false,
        xhrFields: {
            withCredentials: true
        },
        success: function (data) {

        },
        error: function (err) {
            console.log(fd);
        }
    });
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-5-7,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
2 条评论
热度
最新
能否分享一下压缩后图片上传服务器指定目录代码
能否分享一下压缩后图片上传服务器指定目录代码
11点赞举报
你好,发布了篇新文章,可以看看: https://www.clluo.com/hello/article/details/6389a54cf26a20228da5186a
你好,发布了篇新文章,可以看看: https://www.clluo.com/hello/article/details/6389a54cf26a20228da5186a
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
在线图片压缩,JS实现图片压缩功能
1. 选择一张图片 const img_original = document.getElementById('img_original'); const img_output = document.getElementById('img_output'); let blob; function preview(file) { let reader = new FileReader(); reader.onload = functio
vivec
2019/08/20
11.2K0
jquery+html 压缩图片
https://github.com/kingwsi/compress-pic/blob/master/index.html
有勇气的牛排
2023/06/25
3670
使用APICloud平台实现朋友圈功能
1、下拉刷新和上拉加载我用的是 mescroll.js (自带图像懒加载,官方网站有详细使用说明文档) 实现的思路是自定义下啦样式,当下拉的时候图像不停旋转同时向下移动,几秒后向上移动消失在顶部。
APICloud官方
2022/03/16
9330
H5上传图片
最近做产品小A的需求,设计到图片的上传问题,整理一下。 PC上传图片 基本结构 form[enctype="multipart/form-data"] input[type="file"] 上传完毕后
IMWeb前端团队
2017/12/29
1.8K0
详解 JS 压缩图片
作者 | wuwhs https://segmentfault.com/a/1190000023486410
五月君
2020/09/17
13.6K0
前端图片压缩
HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI 。
码客说
2022/12/01
2.9K0
前端图片压缩及上传
图片的上传一般情况下不需要上传大体积的图片,因为如果是用户头像或者是一些要求清晰度不是太高的场景上传大体积图片会很消耗资源,一个是上传耗时比较长,同时也增加了存储的开销,当展示的时候也会消耗下载的带宽,影响加载效率。要求用户上传的图片之前压缩图片很影响用户体验,所以就增加了在前端进行图片压缩的需求。
OECOM
2020/07/02
3K0
前端图片压缩及上传
图片转换js (img对象,file对象,base64,canvas对象),以及图片压缩方式(转载)
首先想一想我们有哪些需求?大多时候我们需要将一个File对象压缩之后再变为File对象传入到远程图片服务器;有时候我们也需要将一个base64字符串压缩之后再变为base64字符串传入到远程数据库;有时候后它还有可能是一块canvas画布,或者是一个Image对象,或者直接就是一个图片的url地址,我们需要将它们压缩上传到远程;
李维亮
2021/07/08
4.9K0
前端实现图片压缩干货分享
在Web开发中,图片压缩是一个常见且重要的需求。随着高清图片和多媒体内容的普及,如何在保证图片质量的同时减少其文件大小,对于提升网页加载速度、优化用户体验至关重要。前端作为用户与服务器之间的桥梁,实现图片压缩的功能可以显著减轻服务器的负担,加快页面渲染速度。本文将探讨前端实现图片压缩的几种方法和技术。
用户10501441
2024/11/24
3750
前端实现图片压缩干货分享
Vue实现剪切板图片压缩
监听剪切板粘贴事件,读取剪切板中的图片文件,转成base64通过img标签显示出来,此时可能会存在剪切板中图片过大,产生上传速度慢问题,接下来就跟大家分享下如何将base64图片进行压缩。先跟大家展示下最终实现的效果:
神奇的程序员
2022/04/10
1.2K0
Vue实现剪切板图片压缩
# 前端图片压缩方案
先通过 js 中 img 构造函数,实例化 img 对象,后将图片的路径给转移到中,再建立一个 canvas 画布,后对画布进行各方面的数值的设置。
九旬
2023/10/19
2860
Canvas 进阶(六)实现图片压缩功能
因此我们设计一个 imageCompress 类,传入一个 option, 其参数有:
小皮咖
2020/02/25
1.4K0
Canvas 进阶(六)实现图片压缩功能
JS 图片压缩
说起图片压缩,大家想到的或者平时用到的很多工具都可以实现,例如,客户端类的有图片压缩工具 PPDuck3, JS 实现类的有插件 compression.js ,亦或是在线处理类的 OSS 上传,文件上传后,在访问文件时中也有图片的压缩配置选项,不过,能不能自己撸一套 JS 实现的图片压缩代码呢?当然可以,那我们先来理一下思路。
政采云前端团队
2020/04/27
27.8K0
JS实现本地预览上传图片并获取宽高
我们在本地上传文件、图片是用file类型的表单,大多时候我们想让上传的图片先预览在我们本地,下面来看看代码吧。
别盯着我的名字看
2022/06/09
8.5K0
Vue解析剪切板图片并实现发送功能
我们在使用QQ进行聊天时,从别的地方Ctrl+C一张图片,然后在聊天窗口Ctrl+V,QQ就会将你刚才复制的图片粘贴到即将发送的消息容器里,按下Enter键,这张图片将会发送出去。接下来跟各位开发者分享下这项功能在Vue中如何来实现。
神奇的程序员
2022/04/10
1.6K0
vue.js + axios.js图片压缩处理并上传到服务器demo
点击查看效果 图片压缩原理 将图片重新画入一个canvas中。可设置最大宽度,再按图片宽高比例定义canvas画布的宽高。 完整代码demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传图片</title> <meta name="renderer" content="webkit"> <meta name="viewport" content="widt
别盯着我的名字看
2022/06/09
5.7K0
【Web技术】907- 前端图片最优化压缩方案
上传图片/视频/文件是我们经常会遇到的问题,但是一旦图片过大就会导致不好的操作体验。图片上传是前端中常见的的业务场景。无论是前台还是后台,适当的对图片进行压缩处理, 可以显著的提升用户体验。而在后台管理系统中,图片压缩不仅仅能够提升后台管理员操作体验,更是可以防止后台设置过大的图片导致前台图片加载过久,从而影响用户体验。
pingan8787
2021/04/07
1K0
【Web技术】907- 前端图片最优化压缩方案
javascript常用工具类的封装
一、js数组工具类 工具类方法 MyArrayFn包含的方法如下 判断一个元素是否在数组中 遍历元素:相当于原生forEach方法 遍历元素,对里面的每个值做处理再返回一个新的值:相当于原生map方法 数组排序:从小到大、从大到小、随机 去重 求两个集合的并集 求两个集合的交集 删除其中一个元素 最大值 最小值 求和 平均值 工具类代码 // js数组工具类 class MyArrayFn { /*判断一个元素是否在数组中*/ contains(arr, val) { re
不愿意做鱼的小鲸鱼
2022/09/26
1.7K0
javascript常用工具类的封装
关于Canvas保存为图片
但是在webapp该方法是不行的,默认是不支持的。一种方法是在android的java代码写js接口,而一个纯webapp,确是很难做到(其实也不是),只不过找了大半天,都没找到。
陨石坠灭
2018/10/19
3.7K0
如何使用FormData上传压缩裁剪后的图片Blob对象
在前端页面,我们通常会遇到需要用户上传图片的操作,可能还会在前端进行图片编辑的操作(比如头像的选区裁剪),然后如果图片过大的话,我们还会对图片进行压缩。这些功能我们通常通过Canvas来进行,最后使用Canvas API函数toDataURL来得到图片的Base64字符串,然后当我们要上传到后台的时候,会面临2种选择:
一斤代码
2018/08/21
3.6K0
如何使用FormData上传压缩裁剪后的图片Blob对象
相关推荐
在线图片压缩,JS实现图片压缩功能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档