首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js上传照片压缩

在JavaScript中实现照片上传前的压缩,主要涉及到图像处理和文件大小优化。以下是相关的基础概念、优势、类型、应用场景以及解决方案。

基础概念

图像压缩是指通过减少图像数据中的冗余信息,以减小文件大小的过程。在Web开发中,通常在前端进行图像压缩可以减少上传时间,减轻服务器负担,并优化用户体验。

优势

  1. 减少上传时间:压缩后的图像文件更小,上传更快。
  2. 节省存储空间:服务器上存储的图像文件更小,节省存储空间。
  3. 提升用户体验:更快的上传速度和更流畅的交互。

类型

  1. 无损压缩:不丢失图像信息,压缩比相对较低。
  2. 有损压缩:通过牺牲一定的图像质量来换取更高的压缩比。

应用场景

  • 用户头像上传
  • 社交媒体图片分享
  • 电商产品图片上传

解决方案

可以使用HTML5的FileReaderCanvas API来实现前端图像压缩。以下是一个简单的示例代码:

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Image Compression</title>
</head>
<body>
    <input type="file" id="fileInput" accept="image/*">
    <canvas id="canvas" style="display:none;"></canvas>
    <img id="compressedImage" alt="Compressed Image">
    <script>
        document.getElementById('fileInput').addEventListener('change', function(event) {
            const file = event.target.files[0];
            if (!file) return;

            const reader = new FileReader();
            reader.onload = function(e) {
                const img = new Image();
                img.onload = function() {
                    const canvas = document.getElementById('canvas');
                    const ctx = canvas.getContext('2d');

                    // 设置压缩后的尺寸
                    const maxWidth = 800;
                    const maxHeight = 600;
                    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;
                    ctx.drawImage(img, 0, 0, width, height);

                    // 压缩质量
                    const quality = 0.7;
                    const compressedDataUrl = canvas.toDataURL('image/jpeg', quality);

                    // 显示压缩后的图像
                    document.getElementById('compressedImage').src = compressedDataUrl;

                    // 可以将compressedDataUrl转换为Blob进行上传
                    const byteString = atob(compressedDataUrl.split(',')[1]);
                    const mimeString = compressedDataUrl.split(',')[0].split(':')[1].split(';')[0];
                    const arrayBuffer = new ArrayBuffer(byteString.length);
                    const intArray = new Uint8Array(arrayBuffer);
                    for (let i = 0; i < byteString.length; i++) {
                        intArray[i] = byteString.charCodeAt(i);
                    }
                    const blob = new Blob([arrayBuffer], { type: mimeString });

                    // 上传blob到服务器
                    // const formData = new FormData();
                    // formData.append('file', blob, 'compressed.jpg');
                    // fetch('/upload', { method: 'POST', body: formData });
                };
                img.src = e.target.result;
            };
            reader.readAsDataURL(file);
        });
    </script>
</body>
</html>

解释

  1. FileReader:读取用户选择的图像文件。
  2. Image:加载图像数据。
  3. Canvas:绘制图像并调整尺寸。
  4. toDataURL:将Canvas内容转换为压缩后的Data URL。
  5. Blob:将Data URL转换为Blob对象,便于上传到服务器。

注意事项

  • 压缩质量可以根据需求调整。
  • 压缩后的图像尺寸可以根据需求调整。
  • 需要处理不同浏览器兼容性问题。

通过这种方式,可以在前端实现图像压缩,提升用户体验和系统性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • JS 图片压缩

    前言 说起图片压缩,大家想到的或者平时用到的很多工具都可以实现,例如,客户端类的有图片压缩工具 PPDuck3, JS 实现类的有插件 compression.js ,亦或是在线处理类的 OSS 上传,...文件上传后,在访问文件时中也有图片的压缩配置选项,不过,能不能自己撸一套 JS 实现的图片压缩代码呢?...压缩思路 涉及到 JS 的图片压缩,我的想法是需要用到 Canvas 的绘图能力,通过调整图片的分辨率或者绘图质量来达到图片压缩的效果,实现思路如下: 获取上传 Input 中的图片对象 File 将图片转换成...(); } }, } }; 上面的代码是可以直接拿来看效果的,不喜欢用 Vue 的也可以把代码稍微调整一下,下面开始具体分解一下代码的实现思路 Input 上传...上传存储图片如果需要对文件大小格式有要求的,可以统一压缩处理图片 前台页面想要编辑图片,可以在 Canvas 处理图片的时候,加一些其他逻辑,例如添加文字,剪裁,拼图等等操作 当然温馨提示:因部分接口有

    25.8K21

    前端图片压缩及上传

    图片的上传一般情况下不需要上传大体积的图片,因为如果是用户头像或者是一些要求清晰度不是太高的场景上传大体积图片会很消耗资源,一个是上传耗时比较长,同时也增加了存储的开销,当展示的时候也会消耗下载的带宽,...要求用户上传的图片之前压缩图片很影响用户体验,所以就增加了在前端进行图片压缩的需求。...压缩方案 前端图片压缩的主要思路就是将图片绘制到canvas中,然后通过canvas的toDataURL方法来控制图片的质量,对图片进行压缩,另一方面是对图片进行宽高等比缩小来达到图片压缩的效果,下面来看一下代码示例...创建image对象 上面的示例说了图片压缩的过程,其中有一个参数是image对象,那么这个image对象是如何来的呢。...当压缩完成后返回的数据就是base64的数据了,我们就可以通过ajax异步来进行上传,在此我采用的是axios进行异步上传,将内容及文件名作为参数传递给后台。

    2.9K20

    js不借助后端,多文件拖拽压缩上传,支持选择文件夹

    在系统中上传文件时,需要支持多文件和文件夹上传,并且需要在文件上传时需要将多文件压缩成zip包,下载的时候,直接下载zip包 听到这个需求,我的第一反应就是js应该没有强大吧,因为压缩和访问文件夹,涉及到了文件系统的读取和修改...主要用到的库是 jszip 则 则这里简单对jszip做下简单介绍,更详细的功能和api请移步官网. jszip是是一个创建,读取和写入.zip文件的js库, api优化,简单 浏览器支持 实现思路如下...用户选中文件或文件夹后,获取文件对象, 2:遍历获取的文件对象 放入实例化的zip对象中 3:使用generateAsync()方法生成文件, 通过formdata提交到服务端 代码如下: 此案例支持拖拽上传多个文件.../assets/logo.png"> 文件压缩上传案例 <label name="myfile" for="myfile" style="display:block;width:200px...important } 这里说一下拖拽上传文件, 主要是用到的原生事件是这三个 ondrop ondragover ondragleave 加上prevent 可以防止拖拽过程

    3.5K10

    使用uglifyjs压缩js

    在做的web项目上线时,我们需要对js文件进行压缩,以减小文件的体积,加快加载速度,提高响应时间。下面我来介绍一个js压缩工具:uglifyjs。...最简单的使用方式: uglifyjs main.js -o main-min.js -c 下面是一些压缩时常用的参数 一些常用的参数列表 -o,--output 指定输出文件,默认情况下为命令行...懒人有懒法,花了点功夫,折腾了一个批处理文件,以后,想要压缩JS,只要双击运行这个.bat文件就可以了!...完整代码如下: @echo off :: 设置压缩JS文件的根目录,脚本会自动按树层次查找和压缩所有的JS SET JSFOLDER=C:\Users\Administrator\Desktop\formini...然后双击就可以批量使用uglifyjs压缩JS文件啦! 注意:uglifyjs不支持ES6

    5.8K20

    js文件分片上传

    写在前面 今天我们写一下关于js的分片上传,因为工作中很多时候上传文件是比较大的,为了不让卡死,我们可以使用分片上传的方式进行文件的传输,下面就简单的将思路梳理一下,然后贴上代码 思路分析 既然是分片上传...,也就是说,假设一个文件的大小是10Mb,我们将其分为十份,每一份都按照前面所的完整的上传过程进行上传,然后循环十次即可将全部的都上传结束,这是我们的基本思路,下面我们贴上代码分析一下 源代码实现...fragmentAtionUpload 分片上传 * @params file 上传的文件 * @params cbUrl 上传的回调函数 * @params size 分片的大小...,他不管上传的大小,所以我们在循环的时候反复调用这个函数即可,最后是文件操作的函数就不多说了,总体来说最基本的分片上传还是比较简单的。...问题分析 这里有一个比较致命的问题,就是因为是分片上传,所以文件是被切成了一段一段的,那么就意味着如果上传的过程中因为网络或者别的原因中断了,那么问题就比较严重了,你可以选择重新上传,但是因为前面的一些片段已经上传上去了

    7.6K20
    领券