>  기사  >  웹 프론트엔드  >  js에서 이미지 업로드 및 압축 방법을 구현하는 방법

js에서 이미지 업로드 및 압축 방법을 구현하는 방법

不言
不言원래의
2018-07-20 11:02:361931검색

이 글은 js가 업로드한 이미지의 압축에 대해 소개합니다. 이는 특정 참고 가치가 있어 도움이 필요한 친구들이 참고할 수 있습니다.

js는 이미지 압축 및 업로드를 실현합니다.

사용된 기술:

  1. #🎜🎜 #canvas 관련 api

  2. html5의 일부 API

호환성: #🎜🎜 ##🎜 🎜#

h5没发现问题,pc低版本浏览器不支持
구현 아이디어:

파일 도메인의 업로드를 모니터링하고 FileReader API를 통해 이미지를 가져옵니다. 원본 데이터
  • 압축된 너비와 높이를 계산한 다음 압축된 데이터를 캔버스에 그려 가로채기
  • <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    
    <body>
        <input type="file" id="file">
        <canvas id="canvas"></canvas>
    </body>
    
    </html>
    <script>
        // 兼容性 h5上可以使用,pc低版本浏览器不支持
        // 准备要用到的img和canvas
        var img = new Image(),
            canvas;
        // 创建读取文件对象
        var render = new FileReader();
        // 如果不需要放在页面上,使用js创建该元素就可以了
        // canvas = document.createElement('canvas');
    
        // 找到canvas,准备画图
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
    
        var input = document.getElementById('file');
        input.addEventListener('change', function (e) {
            // 通过files获取到当前文件
            var file = e.target.files[0];
            // 如果选择的是图片
            if (file.type.indexOf('image') != -1) {
                // 读取file文件,得到的结果为base64位
                render.readAsDataURL(file);
            };
        });
        render.onload = function (result) {
            // 把读取到的base64图片设置给img的src属性
            var src = render.result;
            img.src = src;
        };
        img.onload = function () {
            // 加载完毕后获取图片的原始尺寸
            var origin_width = this.width;
            var origin_height = this.height;
            // 设置最大允许宽高,根据需求自己设置,值越大,图片大小越大
            var max_width = 400;
            var max_height = 400;
    
            // 最终宽高
            var target_width = origin_width;
            var target_height = origin_height;
            if (origin_width > max_width || origin_height > max_height) {
                if (origin_width / origin_height > max_width / max_height) {
                    // 更宽,按照宽度限定尺寸
                    target_width = max_width;
                    target_height = Math.round(max_width * (origin_height / origin_width));
                } else {
                    target_height = max_height;
                    target_width = Math.round(max_height * (origin_width / origin_height));
                }
            }
            canvas.width = target_width;
            canvas.height = target_height;
            // 绘画到画布上
            context.drawImage(img, 0, 0, target_width, target_height);
            /*
                此处得到的是blob对象,blob对象是在ie10及以上才兼容,在ios8_1_1上和iphoneSE上有兼容问题
                canvas.toBlob(function(result) {
                    console.log(result);
                });
            */
            // 读取canvas的数据
            var result = canvas.toDataURL();
            // 得到的结果是base64位的字符串,拿到压缩后的值通过网络请求交给后台处理...
            // 如果是blob对象,需要通过FormData对象发送
            console.log(result);
        };
    
    </script>
    관련 추천:


js의 전체 문자열 배열에 대한 알고리즘 분석

# 🎜🎜#React의 사용: React 컴포넌트 내부의 상태 관리

js의 클래스 확장 및 객체지향 기술 분석
# 🎜 🎜#

위 내용은 js에서 이미지 업로드 및 압축 방법을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.