Nhận kích thước tệp, chiều rộng và chiều cao của hình ảnh trước khi tải lên


98

Làm cách nào để lấy kích thước tệp, chiều cao và chiều rộng của hình ảnh trước khi tải lên trang web của tôi bằng jQuery hoặc JavaScript?



1
Đây là hướng dẫn từng bước về cách lấy tên, loại và kích thước tệp codepedia.info/…
Satinder singh

Cảm ơn câu hỏi của bạn . Mamnoon
Mohammadali Mirhamed

Câu trả lời:


174

Tải lên nhiều hình ảnh với bản xem trước dữ liệu thông tin

Sử dụng HTML5 và API tệp

Ví dụ sử dụng API URL

Nguồn hình ảnh sẽ là một URL đại diện cho đối tượng Blob
<img src="blob:null/026cceb9-edr4-4281-babb-b56cbf759a3d">

const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');

const readImage  = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `Unsupported format ${file.type}: ${file.name}<br>`);

  const img = new Image();
  img.addEventListener('load', () => {
    EL_preview.appendChild(img);
    EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width${img.height} ${file.type} ${Math.round(file.size/1024)}KB<div>`);
    window.URL.revokeObjectURL(img.src); // Free some memory
  });
  img.src = window.URL.createObjectURL(file);
}

EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Remove old images and data
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file" multiple>
<div id="preview"></div>

Ví dụ sử dụng API FileReader

Trong trường hợp bạn cần nguồn hình ảnh dưới dạng chuỗi dữ liệu dài được mã hóa Base64
<img src="data:image/png;base64,iVBORw0KGg... ...lF/++TkSuQmCC=">

const EL_browse  = document.getElementById('browse');
const EL_preview = document.getElementById('preview');

const readImage = file => {
  if ( !(/^image\/(png|jpe?g|gif)$/).test(file.type) )
    return EL_preview.insertAdjacentHTML('beforeend', `<div>Unsupported format ${file.type}: ${file.name}</div>`);

  const reader = new FileReader();
  reader.addEventListener('load', () => {
    const img  = new Image();
    img.addEventListener('load', () => {
      EL_preview.appendChild(img);
      EL_preview.insertAdjacentHTML('beforeend', `<div>${file.name} ${img.width${img.height} ${file.type} ${Math.round(file.size/1024)}KB</div>`);
    });
    img.src = reader.result;
  });
  reader.readAsDataURL(file);  
};

EL_browse.addEventListener('change', ev => {
  EL_preview.innerHTML = ''; // Clear Preview
  const files = ev.target.files;
  if (!files || !files[0]) return alert('File upload not supported');
  [...files].forEach( readImage );
});
#preview img { max-height: 100px; }
<input id="browse" type="file"  multiple>
<div id="preview"></div>
  


1
@SMC caniuse.com/fileapi gần đây chỉ hỗ trợ API tệp. Tôi sẽ xem xét
Roko C. Buljan

khi giá trị của i được cảnh báo trong trình đọc hàm gọi lại. tải lên, nó sẽ hiển thị một gia số ngẫu nhiên! ví dụ: đối với 4 tệp giá trị được cảnh báo là 0 3 2 1. Bất kỳ ai có thể giải thích điều đó?
freerunner

@freerunner tệp của bạn có kích thước khác nhau, do đó không được tải cùng lúc.
Roko C. Buljan,

Đáng buồn thay, điều này yêu cầu tải hình ảnh hai lần. Sẽ tốt hơn nhiều nếu chúng ta có thể lấy chiều rộng và chiều cao làm thuộc tính tệp như kiểu tệp.
MrFox


8

Nếu bạn có thể sử dụng plugin xác thực jQuery, bạn có thể làm như vậy:

Html:

<input type="file" name="photo" id="photoInput" />

JavaScript:

$.validator.addMethod('imagedim', function(value, element, param) {
  var _URL = window.URL;
        var  img;
        if ((element = this.files[0])) {
            img = new Image();
            img.onload = function () {
                console.log("Width:" + this.width + "   Height: " + this.height);//this will give you image width and height and you can easily validate here....

                return this.width >= param
            };
            img.src = _URL.createObjectURL(element);
        }
});

Hàm được chuyển dưới dạng hàm ab onload.

Mã được lấy từ đây


'this' trong this'files [0] không có giá trị. Điều này phải được thay đổi thành element.files [0] để nó hoạt động.
jetlej

Làm thế nào để đạt được điều này cho nhiều lựa chọn tệp?
Shaik Nizamuddin

7

Bản giới thiệu

Không chắc đó có phải là những gì bạn muốn hay không, nhưng chỉ cần ví dụ đơn giản:

var input = document.getElementById('input');

input.addEventListener("change", function() {
    var file  = this.files[0];
    var img = new Image();

    img.onload = function() {
        var sizes = {
            width:this.width,
            height: this.height
        };
        URL.revokeObjectURL(this.src);

        console.log('onload: sizes', sizes);
        console.log('onload: this', this);
    }

    var objectURL = URL.createObjectURL(file);

    console.log('change: file', file);
    console.log('change: objectURL', objectURL);
    img.src = objectURL;
});

3

Đây là một ví dụ JavaScript thuần túy về việc chọn một tệp hình ảnh, hiển thị nó, lặp qua các thuộc tính hình ảnh, sau đó định cỡ lại hình ảnh từ canvas thành thẻ IMG và đặt rõ ràng loại hình ảnh được định cỡ lại thành jpeg.

Nếu bạn nhấp chuột phải vào hình ảnh trên cùng, trong thẻ canvas và chọn Save File As, nó sẽ mặc định ở định dạng PNG. Nếu bạn nhấp chuột phải và Lưu tệp dưới dạng hình ảnh bên dưới, nó sẽ mặc định ở định dạng JPEG. Bất kỳ tệp nào có chiều rộng trên 400px sẽ bị giảm chiều rộng xuống 400px và chiều cao tỷ lệ với tệp gốc.

HTML

<form class='frmUpload'>
  <input name="picOneUpload" type="file" accept="image/*" onchange="picUpload(this.files[0])" >
</form>

<canvas id="cnvsForFormat" width="400" height="266" style="border:1px solid #c3c3c3"></canvas>
<div id='allImgProperties' style="display:inline"></div>

<div id='imgTwoForJPG'></div>

KỊCH BẢN

<script>

window.picUpload = function(frmData) {
  console.log("picUpload ran: " + frmData);

var allObjtProperties = '';
for (objProprty in frmData) {
    console.log(objProprty + " : " + frmData[objProprty]);
    allObjtProperties = allObjtProperties + "<span>" + objProprty + ": " + frmData[objProprty] + ", </span>";
};

document.getElementById('allImgProperties').innerHTML = allObjtProperties;

var cnvs=document.getElementById("cnvsForFormat");
console.log("cnvs: " + cnvs);
var ctx=cnvs.getContext("2d");

var img = new Image;
img.src = URL.createObjectURL(frmData);

console.log('img: ' + img);

img.onload = function() {
  var picWidth = this.width;
  var picHeight = this.height;

  var wdthHghtRatio = picHeight/picWidth;
  console.log('wdthHghtRatio: ' + wdthHghtRatio);

  if (Number(picWidth) > 400) {
    var newHeight = Math.round(Number(400) * wdthHghtRatio);
  } else {
    return false;
  };

    document.getElementById('cnvsForFormat').height = newHeight;
    console.log('width: 400  h: ' + newHeight);
    //You must change the width and height settings in order to decrease the image size, but
    //it needs to be proportional to the original dimensions.
    console.log('This is BEFORE the DRAW IMAGE');
    ctx.drawImage(img,0,0, 400, newHeight);

    console.log('THIS IS AFTER THE DRAW IMAGE!');

    //Even if original image is jpeg, getting data out of the canvas will default to png if not specified
    var canvasToDtaUrl = cnvs.toDataURL("image/jpeg");
    //The type and size of the image in this new IMG tag will be JPEG, and possibly much smaller in size
    document.getElementById('imgTwoForJPG').innerHTML = "<img src='" + canvasToDtaUrl + "'>";
};
};

</script>

Đây là một jsFiddle:

jsFiddle Chọn, hiển thị, lấy thuộc tính và kích thước lại tệp hình ảnh

Trong jsFiddle, nhấp chuột phải vào hình ảnh trên cùng, đó là canvas, sẽ không cung cấp cho bạn các tùy chọn lưu giống như nhấp chuột phải vào hình ảnh dưới cùng trong thẻ IMG.


1

Theo như tôi biết thì không có cách nào dễ dàng để thực hiện việc này vì Javascript / JQuery không có quyền truy cập vào hệ thống tệp cục bộ. Có một số tính năng mới trong html 5 cho phép bạn kiểm tra một số dữ liệu meta nhất định như kích thước tệp nhưng tôi không chắc liệu bạn có thực sự có thể nhận được kích thước hình ảnh hay không.

Đây là một bài viết tôi tìm thấy liên quan đến các tính năng html 5 và một bài viết về IE liên quan đến việc sử dụng điều khiển ActiveX. http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html


1

Vì vậy, tôi bắt đầu thử nghiệm những thứ khác nhau mà FileReader API phải cung cấp và có thể tạo thẻ IMG với URL DATA.

Nhược điểm: Nó không hoạt động trên điện thoại di động, nhưng nó hoạt động tốt trên Google Chrome.

$('input').change(function() {
    
    var fr = new FileReader;
    
    fr.onload = function() {
        var img = new Image;
        
        img.onload = function() { 
//I loaded the image and have complete control over all attributes, like width and src, which is the purpose of filereader.
            $.ajax({url: img.src, async: false, success: function(result){
            		$("#result").html("READING IMAGE, PLEASE WAIT...")
            		$("#result").html("<img src='" + img.src + "' />");
                console.log("Finished reading Image");
        		}});
        };
        
        img.src = fr.result;
    };
    
    fr.readAsDataURL(this.files[0]);
    
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" accept="image/*" capture="camera">
<div id='result'>Please choose a file to view it. <br/>(Tested successfully on Chrome - 100% SUCCESS RATE)</div>

(xem điều này trên jsfiddle tại http://jsfiddle.net/eD2Ez/530/ )
(xem jsfiddle gốc mà tôi đã thêm vào tại http://jsfiddle.net/eD2Ez/ )


0

Một ví dụ xác thực jQuery đang hoạt động:

   $(function () {
        $('input[type=file]').on('change', function() {
            var $el = $(this);
            var files = this.files;
            var image = new Image();
            image.onload = function() {
                $el
                    .attr('data-upload-width', this.naturalWidth)
                    .attr('data-upload-height', this.naturalHeight);
            }

            image.src = URL.createObjectURL(files[0]);
        });

        jQuery.validator.unobtrusive.adapters.add('imageminwidth', ['imageminwidth'], function (options) {
            var params = {
                imageminwidth: options.params.imageminwidth.split(',')
            };

            options.rules['imageminwidth'] = params;
            if (options.message) {
                options.messages['imageminwidth'] = options.message;
            }
        });

        jQuery.validator.addMethod("imageminwidth", function (value, element, param) {
            var $el = $(element);
            if(!element.files && element.files[0]) return true;
            return parseInt($el.attr('data-upload-width')) >=  parseInt(param["imageminwidth"][0]);
        });

    } (jQuery));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.