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?
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?
Câu trả lời:
Sử dụng HTML5 và API tệp
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>
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>
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
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;
});
Đâ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.
<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>
<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.
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
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/ )
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));