在表单提交之前,在javascript中缩小客户端图像的大小

时间:2017-08-16 07:11:40

标签: javascript html form-submit filereader image-resizing

我试图在客户端读取后缩小图像的大小,javascript代码如下,我在这里遇到两个问题 1)图像预览未显示在img id“img-upload”上 2)通过表单提交“reader.readAsDataURL(input.files [0])”提交的文件不是缩小的文件。

我确实尝试更改代码以在图像onload中移动阅读器,然后传递e.target.files [0],但这也无效。

请告知我如何调整大小,然后通过表单提交将其发送到我的后端。

function readURL(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();  

                reader.onload = function (e) {
                        $('#img-upload').attr('src', e.target.result);
                        img.onload = function () {
                            var MAX_WIDTH = 100;
                            var MAX_HEIGHT = 100;
                            var width = img.width;
                            var height = img.height;

                            if (width > height) {
                               if (width > MAX_WIDTH) {
                                  height *= MAX_WIDTH / width;
                                  width = MAX_WIDTH;
                               }
                            } else {
                               if (height > MAX_HEIGHT) {
                                  width *= MAX_HEIGHT / height;
                                  height = MAX_HEIGHT;
                               }
                            }

                            var canvas = document.createElement("canvas");
                            canvas.width = width;
                            canvas.height = height;
                            canvas.getContext("2d").drawImage(this, 0, 0, width, height);

                            img.src = e.target.result;
                            $('#img-upload').append(img);
                        }  

                }
                reader.readAsDataURL(input.files[0]);

            }
        }

1 个答案:

答案 0 :(得分:0)

您的代码正在创建对img.onload的无限调用 因为这个

img.src = e.target.result;语句在onload内。

除此之外,您还没有从画布上阅读已调整大小的图像。

您可以通过以下方式执行此操作

canvas.toDataURL('image/png');

<强>段

&#13;
&#13;
var img = $('#img-upload')[0];
var show = $('#show')[0];

function readURL(input) {
  if (input.files && input.files[0]) {
    var reader = new FileReader();

    reader.onload = function(e) {
      debugger;
      $('#img-upload').attr('src', e.target.result);
      img.onload = function() {
        var MAX_WIDTH = 100;
        var MAX_HEIGHT = 100;
        var width = img.width;
        var height = img.height;

        if (width > height) {
          if (width > MAX_WIDTH) {
            height *= MAX_WIDTH / width;
            width = MAX_WIDTH;
          }
        } else {
          if (height > MAX_HEIGHT) {
            width *= MAX_HEIGHT / height;
            height = MAX_HEIGHT;
          }
        }

        var canvas = document.createElement("canvas");
        canvas.width = width;
        canvas.height = height;
        canvas.getContext("2d").drawImage(this, 0, 0, width, height);

        //Causing Infinite Loop in your code
        //img.src = e.target.result; 
        
        // Get dataURL of resized image from canvas  
        show.src = canvas.toDataURL('image/png');

      }

    }
    reader.readAsDataURL(input.files[0]);

  }
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" onchange="readURL(this)">
<img id="img-upload">
<img id="show">
&#13;
&#13;
&#13;