JS图片压缩预览/下载

前言

好像没啥好说的~

大概做法

  • 先由filereader获取图片的base64,控制图片生成,但不显示。
  • 然后将图片按比例设置好压缩后的宽高绘制在canvas画布上。
  • 之后利用canvas的自带方法再次转换成base64,再对base64进行解码存储到数组缓存区,生成blob,然后创建下载链接就完了。

上代码,看注释就完了

//html
<input type="file" id="file"> //这里选择图片
<canvas id="canvas"></canvas> //canvas画布
//js
document.getElementById('file').onchange = function () {
        console.log(this.files[0]);
        //注意这个files是数组
        reader.readAsDataURL(this.files[0]);
        var reader = new FileReader();
        reader.onload = function (e) {
            //下面这三行就可以实现文件选择了图片以后,预览的功能,但是有些图片可能太大了影响页面观感,得统一缩小下。
            //var img = new Image();  
            // img.src = e.target.result;  
            // document.body.appendChild(img);
            render(e.target.result) //这个方法实现图片的压缩下载
        }  

}
    var MAX_H = 100;
    function render(src){  
        // 创建一个 Image 对象  
        var image = new Image();  
        // 设置src属性,加载图片内容,此时还未压缩
        image.src = src;  
        // 绑定 load 事件处理器,加载完成后执行  
        image.onload = function(){  
            // 获取 canvas DOM 对象  
            var canvas = document.getElementById("canvas");  
            // 如果高度超标  
            if(image.height > MAX_H) {  
                // 宽度等比例缩放 *=  
                image.width *= MAX_H / image.height;  
                image.height = MAX_H;  
            }  
            // 获取 canvas的 2d 环境对象, 有些上古浏览器不支持canvas
            var ctx = canvas.getContext("2d");  
            // canvas清屏  
            ctx.clearRect(0, 0, canvas.width, canvas.height);  
            // 把canvas宽高设置为图片宽高  
            canvas.width = image.width;  
            canvas.height = image.height;  
            // 将图像绘制到canvas上 
            //drawImage(img,startX,startY,endX,endY)
            ctx.drawImage(image, 0, 0, image.width, image.height);  
            //将绘制好的canvas图像转为DataURL
            //toDataURL(图片类型,图片质量),这个图片质量越高就越清晰(相同宽高)
            //canvas.toDataURL 返回的默认格式就是 image/png
            var data = canvas.toDataURL('image/jpeg',0.5);
           //获取图片的dataUrl转成blob
           //这下面转blob的代码我也没搞懂,无百度了DataURL转blob就是这些代码了
            data = data.split(',')[1];
            data = window.atob(data);
            var ia = new Uint8Array(data.length);
            for (var i = 0; i < data.length; i++) {
                ia[i] = data.charCodeAt(i);
            };
            var blob = new Blob([ia], {
                type: "image/jpeg"
            });
            
            //生成blob文件的下载链接,把链接附在a便签上,把a便签加入dom中,点击就可以下载啦
            
            var url3 = URL.createObjectURL(blob);
            var a = document.createElement('a');
            a.href = url3;
            a.text = '测试图片';
            a.download = 'mytest.jpg';
            document.body.appendChild(a);
        };  
    };  

效果预览

clipboard.png

后语

压缩后上传的操作,这里就不写了,百度下blob如何生成file上传即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在iOS应用中集成Vue.js框架并处理图片压缩通常涉及到前端数据处理、图片资源管理以及后端服务器配合等几个方面。 ### iOS Vue项目中图片压缩的基本流程: #### 1. **前端图片加载与显示** 使用Vue.js进行前端开发时,可以利用`axios`或`fetch`API来进行网络请求获取图片数据,并将图片展示到页面上。Vue.js框架本身并不直接负责图片压缩,而是用于构建交互式的用户界面。 #### 2. **图片压缩策略** - **懒加载**:只加载当前视图可见的图片,其他图片可以延迟加载甚至异步下载。通过配置Vue的`<img>`标签的`lazy="true"`属性实现基本的懒加载功能,进一步可以自定义懒加载的逻辑。 - **按需调整大小**:可以根据设备屏幕尺寸动态调整图片宽度,避免高分辨率设备显示过大的图片占用不必要的带宽和内存空间。 - **内容感知缩放**:对于高质量图片,可以采用更智能的方式如使用WebP或其他支持的内容感知缩放技术,基于图片内容自动选择合适的压缩比例和质量。 #### 3. **服务端图片优化** 对于服务器端的图片存储和分发,可以考虑将原始大图转换成多个版本,包括低分辨率的预览图和适配不同场景的图片。这可以通过服务器端的图片处理库实现,比如使用AWS S3自带的图像处理工具、Firebase Cloud Functions 或者搭建自己的图片处理微服务(例如使用Node.js和Sharp、Python和PIL等库)。 #### 4. **客户端缓存策略** 利用浏览器的缓存机制,对于经常访问的图片,通过设置适当的Cache-Control头信息,可以让浏览器缓存图片减少再次加载的时间。同时,可以使用CDN服务加速图片的全球分发,提高用户体验。 ### 实现步骤示例: 假设您正在使用Express作为后端服务器: ```javascript const express = require('express'); const multer = require('multer'); const sharp = require('sharp'); const app = express(); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.single('image'), async (req, res) => { try { const imageBuffer = await sharp(req.file.path) .resize(800) // 自动保持纵横比 .jpeg({ quality: 50 }) // 设置JPEG的质量,从0(完全压缩)到100(无损) .toFile(`compressed/${req.file.filename}`); fs.unlinkSync(req.file.path); // 删除原文件 res.status(200).send({ success: true, message: 'Image compression successful', compressedImagePath: `/compressed/${req.file.filename}` }); } catch (error) { console.error(error); res.status(500).send({ error: 'Failed to compress the image' }); } }); app.listen(3000, () => console.log('Server is running on port 3000')); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值