前端 canvas压缩图片上传

学习随笔

HTML代码

       <input type="file" name="" id="upload">

JS代码

		// 获取input元素
        const upload = document.getElementById('upload')

        upload.addEventListener('change', (e) => changeCallback(e))

        // 选择文件后执行的回调
        function changeCallback(e) {
            const FILE_SIZE = 4 * 1024 * 1024
            const FILE_DESC = '1MB'
            const FILE_TYPE = ['image/png', 'image/gif']

            const [file] = e.target.files
            const {
                size: fileSize,
                type: fileType
            } = file

            const index = FILE_TYPE.findIndex(item => {
                return item === fileType
            })
            // 图片类型检查
            if (index < 0) {
                alert(`不支持[${fileType}]文件类型`)
                upload.value = ''
                return
            }
            // 图片容量检查
            if (fileSize > FILE_SIZE) {
                alert(`文件大于${FILE_DESC}`)
                upload.value = ''
                return
            }
            // 压缩图片
            convertImageBase64(file, (base64Image) => compress(base64Image, uploadToServer))
        }

        // 将图片转化为base64
        function convertImageBase64(file, callback) {
            const reader = new FileReader()
            reader.addEventListener('load', (e) => {
                const base64 = e.target.result
                callback && callback(base64)
                // reader = null // 释放内存
            })
            reader.readAsDataURL(file)
        }

        // 输出压缩后的base64
        function compress(base64Image, callback) {
            let maxW = 1024 // 允许图片的最大宽度
            let maxH = 1024 // 允许图片的最大高度

            const image = new Image()
            image.addEventListener('load', (e) => {
                let ratio // 图片压缩比
                let needCompress = false // 释放需要压缩

                const imageW = image.naturalWidth // 图片的原始宽度
                const imageH = image.naturalHeight // 图片的原始高度

                if (maxW < imageW) {
                    needCompress = true
                    ratio = imageW / maxW //获取压缩比
                    maxH = imageH / ratio //根据压缩比重新计算高度
                }
                if (maxH < imageH) {
                    needCompress = true
                    ratio = imageH / maxH //获取压缩比
                    maxW = imageW / ratio //根据压缩比重新计算宽度
                }

                // 如不需要压缩,获取图片实际尺寸
                if (!needCompress) {
                    maxW = imageW
                    maxH = imageH
                }

                const canvas = document.createElement('canvas')
                canvas.setAttribute('id', '__compress__')
                canvas.width = maxW
                canvas.height = maxH
                canvas.style.visibility = 'hidden'
                document.body.appendChild(canvas)

                const ctx = canvas.getContext('2d')
                ctx.clearRect(0, 0, maxW, maxH) // 清除画布,防止出现多个图片重叠
                ctx.drawImage(image, 0, 0, maxW, maxH)

                const compressImage = canvas.toDataURL('image/jpeg', 0.9)
                callback(compressImage)
                canvas.remove()

                // 显示压缩后的图片
                const __image__ = new Image()
                __image__.src = compressImage
                document.body.appendChild(__image__)
            })
            image.src = base64Image
            document.body.appendChild(image) // 显示上传的图片预览
        }

        // 压缩成功后的回调(上传至服务器)
        function uploadToServer(compressImage) {
            console.log('upload to server ...');
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
压缩HTML: 可以使用多种工具来压缩HTML,例如HTMLMinifier或UglifyJS等。这些工具可以删除不必要的空格、注释和其他字符,从而减小文件大小。以下是使用HTMLMinifier进行HTML压缩的示例代码: ```javascript const html = '<html><head><title>Hello World</title></head><body><p>Hello, world!</p></body></html>'; const minifiedHtml = htmlMinifier.minify(html, { collapseWhitespace: true, removeComments: true, minifyCSS: true, minifyJS: true }); ``` 图片上传: 可以使用HTML5的File API来实现图片上传。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <script> const input = document.getElementById('upload-input'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const imageData = event.target.result; // 图片数据 // 将图片数据上传到服务器 }; reader.readAsDataURL(file); }); </script> ``` JS Canvas 修改图片尺寸和压缩大小: 可以使用canvas的API来修改图片的尺寸和压缩图片大小。以下是一个基本的示例: ```html <input type="file" id="upload-input"> <canvas id="canvas"></canvas> <script> const input = document.getElementById('upload-input'); const canvas = document.getElementById('canvas'); const context = canvas.getContext('2d'); input.addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = (event) => { const img = new Image(); img.onload = () => { // 计算缩小后的尺寸 const maxWidth = 300; const maxHeight = 300; let width = img.width; let height = img.height; if (width > height) { if (width > maxWidth) { height *= maxWidth / width; width = maxWidth; } } else { if (height > maxHeight) { width *= maxHeight / height; height = maxHeight; } } canvas.width = width; canvas.height = height; // 绘制缩小后的图片 context.drawImage(img, 0, 0, width, height); // 压缩图片 const quality = 0.7; const imageData = canvas.toDataURL('image/jpeg', quality); // 将图片数据上传到服务器 }; img.src = event.target.result; }; reader.readAsDataURL(file); }); </script> ``` 以上是一个基本的实现,具体的实现方式可以根据需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值