• 图片压缩


    基于vue的图片上传压缩

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>基于vue的图片上传压缩</title></head>
    <body>
    <input class="hiddenInput" type="file" name="uploadFile" id="imageFile" accept="image/*" @change="uploadImg($event)"/>
    </body>
    </html>
    <script>
        //图片压缩//
        function photoCompress(file) {
            return new Promise((resolve, reject) => {
                let reader = new FileReader();
                reader.onload = function () {
                    img.src = e.target.result;
                }
    
                reader.onerror = function (e) {
                    reject(e);
                }
    
                reader.readAsDataURL(file);
                img.onload = function () {
                    resolve(img);
                }
                img.onerror = function () {
                    reject(e);
                }
            })
        }
    
        //canvas绘制图片//
        function canvasDataURL(img, type, mx, mh) {
            return new Promise((resolve, reject) => {
                let canvas = document.createElement('canvas');
                let context = canvas.getContext('2d');
                let ctx = canvas.getContext('2d');
                let quality = 0.7// 默认图片质量为0.7//
                // 创建属性节点
                let anw = document.createAttribute('width')
                anw.nodeValue = mx
                let anh = document.createAttribute('height')
                anh.nodeValue = mh
                canvas.setAttributeNode(anw)
                canvas.setAttributeNode(anh)
                ctx.drawImage(img, 0, 0, mx, mh);
                // 图像质量       //         //
                if (file.size > 300 * 1024) {
                    quality = 0.3
                }
                // quality值越小,所绘制出的图像越模糊//
                let base64 = canvas.toDataURL('image/jpeg', quality)
                resolve(base64)
            })
        }
    
        function convertBase64UrlToBlob(urlData) {
            let arr = urlData.split(',')
            let mime = arr[0].match(/:(.*?);/)[1]
            let bstr = atob(arr[1])
            let n = bstr.length
            let u8arr = new Uint8Array(n)
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n)
            }
            return new Blob([u8arr], {type: mime})
        }
    
        //上传//
        async function upload(file) {
            const img = await photoCompress(file);
            const blob = await canvasDataURL(img, file.type, 1000, 1000);
        }
    
        function convertBase64UrlToBlob(urlData) {
            let arr = urlData.split(',')
            let mime = arr[0].match(/:(.*?);/)[1]
            let bstr = atob(arr[1])
            let n = bstr.length
            let u8arr = new Uint8Array(n)
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n)
            }
            return new Blob([u8arr], {type: mime})
        }
    
        function canvasDataURL(path, file, callback) {
            let img = new Image()
            img.src = path
            img.onload = function () {
                const { originWidth, height: originHeight} = img;
                // 默认按比例压缩
                let w = img.width
                let h = img.height
                let quality = 0.7
                // 默认图片质量为0.7
                // 生成canvas
                let canvas = document.createElement('canvas')
                let ctx = canvas.getContext('2d')
                // 创建属性节点
                let anw = document.createAttribute('width')
                anw.nodeValue = w
                let anh = document.createAttribute('height')
                anh.nodeValue = h
                canvas.setAttributeNode(anw)
                canvas.setAttributeNode(anh)
                ctx.drawImage(img, 0, 0, w, h)
                // 图像质量
                console.log(`压缩之前的大小:${file.size / 1024}kb`)
                if (file.size > 300 * 1024) {
                    quality = 0.3
                }
                // quality值越小,所绘制出的图像越模糊
                let base64 = canvas.toDataURL('image/jpeg', quality)
                callback(base64)
            }
        }
    
        function photoCompress(file, objDiv) {
            let reader = new FileReader()
            reader.readAsDataURL(file)
            reader.onload = function () {
                let result = this.result;
                let img = canvasDataURL(result, file, objDiv)
            }
        }
    
        document.getElementById("imageFile").addEventListener("change", function (e) {
            upload(e);
        })
    
        function upload(e) {
            const file = e.target.files[0];
            photoCompress(file, function (base64Codes) {
                let form = new FormData();
                let bl = convertBase64UrlToBlob(base64Codes);
                console.log(`压缩之后的大小:${bl.size / 1024}kb`)
            });
        }
    </script>

    上传文件压缩

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>上传文件压缩</title></head>
    <body>
    <div>
        <h3>图片上传压缩</h3>
        <input type="file" id="file" placeholder="请上传图片" accept="image/*"/>
    </div>
    </body>
    </html>
    <script>
        document.getElementById("file").addEventListener("change", function (e) {
        console.log("压缩前", e.target.files[0].size);
        let result = e.target.files[0];
        opload(result);
    })
    
    function readImg(file) {
        return new Promise((resolve, reject) => {
            const img = new Image();
            const reader = new FileReader();
            reader.onload = function (e) {
                img.src = e.target.result;
                console.log(e);
            }
            reader.onerror = function (e) {
                reject(e);
            }
            reader.readAsDataURL(file);
            img.onload = function () {
                resolve(img);
            }
            img.onerror = function () {
                reject(e);
            }
        })
    }
    //图片压缩
    function compressImg(img, type, mx, mh) {
        return new Promise((resolve, reject) => {
            const canvas = document.createElement('canvas');
            const context = canvas.getContext('2d');
            const { originWidth, height: originHeight} = img;
            // 最大尺寸限制
            const maxWidth = mx;
            const maxHeight = mh;
            // 目标尺寸
            let targetWidth = originWidth;
            let targetHeight = originHeight;
            if (originWidth > maxWidth || originHeight > maxHeight) {
                if (originWidth / originHeight > 1) {
                    //  宽图片
                    targetWidth = maxWidth;
                    targetHeight = Math.round(maxWidth * (originHeight / originWidth))
                } else {
                    // 高图片
                    targetHeight = maxHeight;
                    targetWidth = Math.round(maxHeight * (originWidth / originHeight));
                }
            }
            canvas.width = targetWidth;
            canvas.height = targetHeight;
            context.clearRect(0, 0, targetWidth, targetHeight);
            // 图片绘制
            context.drawImage(img, 0, 0, targetWidth, targetHeight);
            canvas.toBlob(function (blob) {
                console.log(blob);
                resolve(blob);
            }, type || 'image/png')
        })
    }
    
    async function opload(file) {
        const img = await readImg(file);
        console.log(img);
        const blob = await compressImg(img, file.type, 1000, 1000);
        const formData = new FormData();
        console.log("压缩后", blob);
        formData.append("file", blob, `file_${Date.parse(new Date())}.jpg`);
    }
    </script>

    vue

    <template>
        <div>
            <input class="hiddenInput" type="file" name="uploadFile" id="imageFile" accept="image/*"
                   @change="uploadImg($event)"/>
        </div>
    </template>
    
    <script>
        export default {
            data() {
                return {
    
                }
            },
            created() {
    
            },
            methods: {
                uploadImg(e) {
                    const file = e.target.files[0];
                    this.photoCompress(file, (base64Codes) => {
                        let form = new FormDate();
                        form.append("op;loadFile", b1, `file_${Date.parse(new Date())}.jpg`);
                        UploadImgInClaim(form).then((res) => {
                            if (res.status) {
                                let url = window.URL.createObjectURL(file);
                            }
                        }).catch((err) => {
                            console.log(err);
                        })
                    })
                },
                //图片压缩
                photoCompress(file, objDiv) {
                    let reader = new FileReader();
                    reader.readAsDataURL(file);
                    reader.onload = function () {
                        let result = this.result;
                        this.canvasDataURL(result, file, objDiv);
                    }
                },
                canvasDataURL(path, file, callback) {
                    let img = new Image();
                    img.src = path;
                    img.onload = function () {
                        let _this = this;
                        //按比例默认缩放
                        let w = _this.width;
                        let h = _this.height;
                        let quality = 0.7;
                        //生成canvas
                        let canvas = document.createElement("canvas");
                        let ctx = canvas.getContext("2d");
                        //创建属性节点      // 创建属性节点
                        let anw = document.createAttribute('width')
                        anw.nodeValue = w
                        let anh = document.createAttribute('height')
                        anh.nodeValue = h
                        canvas.setAttributeNode(anw)
                        canvas.setAttributeNode(anh)
                        ctx.drawImage(_this, 0, 0, w, h)
                        // 图像质量
                        console.log(`压缩之前的大小:${file.size / 1024}kb`)
                        if (file.size > 300 * 1024) {
                            quality = 0.3
                        }
                        // quality值越小,所绘制出的图像越模糊
                        let base64 = canvas.toDataURL('image/jpeg', quality)
                        callback(base64)
                    }
                },
                convertBase64UrlToBlob(urlData) {
                    let arr = urlData.split(',')
                    let mime = arr[0].match(/:(.*?);/)[1]
                    let bstr = atob(arr[1])
                    let n = bstr.length
                    let u8arr = new Uint8Array(n)
                    while (n--) {
                        u8arr[n] = bstr.charCodeAt(n)
                    }
                    return new Blob([u8arr], {type: mime})
                }
            }
        }
    </script>
    
    <style>
    
    </style>
  • 相关阅读:
    AcWing 524. 愤怒的小鸟
    AcWing 算法提高课题解目录
    AcWing 292. 炮兵阵地
    AcWing 798. 差分矩阵
    golang 写数据到excel文件 清明
    使用golang开发mqtt服务压力测试工具 清明
    Linux云服务器安装JDK步骤 清明
    shell monitor memory 清明
    自己实现一个Electron跨进程消息组件(兼新书自荐)
    如何把Electron做成一个Runtime,让多个应用共享同一个Electron
  • 原文地址:https://www.cnblogs.com/liufeiran/p/15950689.html
Copyright © 2020-2023  润新知