上传base64图片并压缩

elementUI+react

布局

         <Dialog
                    title="充值"
                    visible={ dialogVisible }
                    onCancel={ () => this.setState({ dialogVisible: false }) }
                >
                    <Dialog.Body>
                        <Form labelWidth="120" ref={ e => {this.form=e} } model={ form } rules={ rules }>
                            <Form.Item label="支付凭证" prop="voucher">
                                <div className="my-upload">
                                <input className="upload-input" type="file" id="input" name="file1" onChange={ this.inputfile } />
                                { voucher ? <img src={ voucher } className="avatar"  /> : <i className="el-icon-plus avatar-uploader-icon" /> }
                                </div>
                            </Form.Item>
                        </Form>
                    </Dialog.Body>
                    <Dialog.Footer className="dialog-footer">
                        <Button onClick={ () => this.setState({ dialogVisible: false }) }>{‘取 消‘}</Button>
                        <Button type="primary" onClick={ this.saveContent } loading={ btnLoading }>{‘确 定‘}</Button>
                    </Dialog.Footer>
                </Dialog>

完整方法:

  beforeAvatarUpload(file) {
        const isJPG = file.type === ‘image/jpeg‘
        const isLt2M = file.size / 1024 / 1024 < 2
        if (!isJPG) {
            Message(‘上传头像图片只能是 JPG 格式!‘)
        }
        if (!isLt2M) {
            Message(‘上传头像图片大小不能超过 2MB!‘)
        }
        return isJPG && isLt2M
    }  // input onchange上传方法
    inputfile =()=> {
        const file1 = document.querySelector(‘#input‘).files[0]
        // const flag = this.beforeAvatarUpload(file1)
        // if(!flag){
        //     return false
        // }
        console.log(file1)
        const that=this
    if(file1){
      var reader = new FileReader()
                    // 图片文件转换为base64
            reader.readAsDataURL(file1)
            reader.onload = function(){
                // 显示图片
                // document.getElementById(‘file1_img‘).src = this.result
                // that.setState({
                //     voucher:this.result
                // })
                that.dealImage(this.result, 800, that.printing)
            }
    }
    }  //回调方法
    printing = base64 => {
        // console.log(‘压缩后‘, base64.length / 1024)
        this.setState({
            voucher: base64
        })
    }
    //压缩方法
    dealImage = (base64, w, callback) => {
        var newImage = new Image()
        //压缩系数0-1之间
        var quality = 0.6
        newImage.src = base64
        newImage.setAttribute(‘crossOrigin‘, ‘Anonymous‘)    //url为外域时需要
        var imgWidth, imgHeight
        newImage.onload = function () {
            imgWidth = this.width
            imgHeight = this.height
            var canvas = document.createElement(‘canvas‘)
            var ctx = canvas.getContext(‘2d‘)
            if (Math.max(imgWidth, imgHeight) > w) {
                if (imgWidth > imgHeight) {
                    canvas.width = w
                    canvas.height = w * imgHeight / imgWidth
                } else {
                    canvas.height = w
                    canvas.width = w * imgWidth / imgHeight
                }
            } else {
                canvas.width = imgWidth
                canvas.height = imgHeight
                quality = 0.6
            }
            ctx.clearRect(0, 0, canvas.width, canvas.height)
            ctx.drawImage(this, 0, 0, canvas.width, canvas.height)
            var ba = canvas.toDataURL(‘image/jpeg‘, quality) //压缩语句
            // 如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间,请加以下语句,quality初始值根据情况自定
            // while (base64.length / 1024 > 150) {
            //     quality -= 0.01;
            //     base64 = canvas.toDataURL("image/jpeg", quality);
            // }
            // 防止最后一次压缩低于最低尺寸,只要quality递减合理,无需考虑
            // while (base64.length / 1024 < 50) {
            //     quality += 0.001;
            //     base64 = canvas.toDataURL("image/jpeg", quality);
            // }
            callback(ba) //必须通过回调函数返回,否则无法及时拿到该值
        }
    }

原文地址:https://www.cnblogs.com/wang715100018066/p/11434214.html

时间: 2024-10-08 01:13:19

上传base64图片并压缩的相关文章

上传base64图片到七牛云前端遇到的坑

介意前端普通引入七牛云SDk上传图片到七牛云需要多个js,所以才有了base64的上传方式,简化操作,(懒.) 七牛云官方文档如下 https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code 我们前端理所当然就复制黏贴了..然后问题就来了 看地址 var url = "http://upload.qiniu.com/putb64/20264"; //非华东空间需要根据

Android上传Base64图片,图片变成黑色一块的问题

由于Base64编码后的图片字符串有很多+号字符,但在提交到服务端后+号会变为空格,所以服务端再根据Base64字符串生成的图片就不是原来的图片了. 解决方法是: 提交前将+号编码为%2B, postString.replace("+","%2B")像这样

移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器. 一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了. 处理过程 LocalResizeIM

动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传

现在科技太发达,移动设备像素越来越高,随便一张照片2M+,但是要做移动端图片上传和pc上略有不同,移动端你不能去限制图片大小,让用户先处理图片再上传,这样不现实.所以理解的解决方案就是在上传先进行图片压缩,然后再把压缩后的图片上传到服务器. 一翻google之后,发现了localResizeIMG,它会对图片进行压缩成你指定宽度及质量度并转换成base64图片格式,那么我们就可以把这个base64通过ajax传到后台,再进行保存,先压缩后上传的目的就达到了. 处理过程 LocalResizeIM

php 上传缩放图片

有时上传图片时因为图片太大了,不仅占用空间,消耗流量,而且影响浏(图片的尺寸大小不一).下面分享一种等比例不失真缩放图片的方法,这样,不管上传的图片尺有多大,都会自动压缩到我们设置尺寸值的范围之内.经过测试,证明实用. view sourceprint? 01 <?php 02 function resizeImage($im,$maxwidth,$maxheight,$name,$filetype) 03  { 04   $pic_width = imagesx($im); 05   $pic

文件上传之图片预览

一.业界现状分析 有时候我们需要在上传图片之前为用户提供图片预览的功能,HTML5规范出来之前,由于缺少原生的File API支持,我们需要借助Flash或者浏览器插件来满足这种需求.有了HTML5,我们可使用URL或者FileReader对象实现预览功能. 二.应用场景 图片分享类的应用,如Flickr,Facebook.相册应用,如:QQ相册. 虽然139邮箱没有合适的应用场景,但是可将技术预研的成果作为技术储备,好东西总有用得着的时候. 三.编码实现 方式一:window.URL (1).

调起摄像头、上传下载图片、本地展示图片

之前那偏微信JS-SDK授权的文章实现了分享接口,那么这里总结一下如何在微信里面通过js调起原生摄像头,以及上传下载图片. 1.配置 页面引入通过jssdk授权后,传入wx对象,首先配置需要的接口 wx.config({ /* debug: true, */ appId: appid, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [ 'chooseImage',//拍照或从手机相册中选图接口

微信开发之调起摄像头、本地展示图片、上传下载图片

之前那篇微信JS-SDK授权的文章实现了分享接口,那么这里总结一下如何在微信里面通过js调起原生摄像头,以及上传下载图片. 1.配置 页面引入通过jssdk授权后,传入wx对象,首先配置需要的接口 wx.config({ /* debug: true, */ appId: appid, timestamp: timestamp, nonceStr: nonceStr, signature: signature, jsApiList: [ 'chooseImage',//拍照或从手机相册中选图接口

KindEditor3.x-自动上传Word图片功能.

Chrome+IE默认支持粘贴剪切板中的图片,但是我要发布的文章存在word里面,图片多达数十张,我总不能一张一张复制吧?Chrome高版本提供了可以将单张图片转换在BASE64字符串的功能.但是无法处理多张图片.而且转换成BASE64后是作为内容一起提交给服务器,不能够将图片单独保存在另外一台服务器中.如果需要单独保存则需要自已进行处理.比较麻烦. 我希望打开Word或者WPS文档后,复制内容然后直接粘贴到富文本编辑器中,编辑器自动将图片批量上传到服务器中,无论文档中有多少张图片,编辑器都全部