ฉันจะรับขนาดไฟล์ความสูงและความกว้างของภาพก่อนที่จะอัปโหลดไปยังเว็บไซต์ด้วย jQuery หรือ JavaScript ได้อย่างไร
ฉันจะรับขนาดไฟล์ความสูงและความกว้างของภาพก่อนที่จะอัปโหลดไปยังเว็บไซต์ด้วย jQuery หรือ JavaScript ได้อย่างไร
คำตอบ:
ใช้HTML5 และFile API
แหล่งที่มาของภาพจะเป็นURL ที่แสดงถึงวัตถุ 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>
ในกรณีที่คุณต้องการแหล่งที่มาของภาพที่มีสตริงข้อมูลเข้ารหัส 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>
หากคุณสามารถใช้ปลั๊กอินตรวจสอบความถูกต้อง jQuery ได้คุณสามารถทำได้ดังนี้:
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);
}
});
ฟังก์ชันถูกส่งผ่านเป็นฟังก์ชัน ab onload
รหัสถูกนำมาจากที่นี่
ไม่แน่ใจว่าเป็นสิ่งที่คุณต้องการหรือไม่ แต่ตัวอย่างง่ายๆ:
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;
});
นี่คือตัวอย่าง JavaScript ที่แท้จริงของการเลือกไฟล์รูปภาพแสดงมันวนลูปผ่านคุณสมบัติของรูปภาพจากนั้นปรับขนาดรูปภาพจากผืนผ้าใบใหม่เป็นแท็ก IMG และตั้งค่าประเภทรูปภาพที่ปรับขนาดใหม่เป็น jpeg อย่างชัดเจน
หากคุณคลิกขวาที่รูปภาพบนสุดในแท็กผ้าใบแล้วเลือกบันทึกไฟล์เป็นค่าเริ่มต้นจะเป็นรูปแบบ PNG หากคุณคลิกขวาและบันทึกไฟล์เป็นภาพล่างค่าเริ่มต้นจะเป็นรูปแบบ JPEG ไฟล์ใด ๆ ที่มีความกว้างเกิน 400px จะถูกลดความกว้าง 400px และความสูงจะเป็นสัดส่วนกับไฟล์ต้นฉบับ
<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>
นี่คือ jsFiddle:
jsFiddle Pick แสดงรับคุณสมบัติและปรับขนาดไฟล์รูปภาพใหม่
ใน jsFiddle การคลิกขวาที่รูปภาพบนสุดซึ่งเป็นผืนผ้าใบจะไม่ให้ตัวเลือกการบันทึกเหมือนกับการคลิกขวาที่รูปภาพด้านล่างในแท็ก IMG
เท่าที่ฉันรู้ไม่มีวิธีง่ายๆในการทำเช่นนี้เนื่องจาก Javascript / JQuery ไม่มีสิทธิ์เข้าถึงระบบไฟล์ภายในเครื่อง มีคุณสมบัติใหม่บางอย่างใน html 5 ที่ช่วยให้คุณตรวจสอบข้อมูลเมตาบางอย่างเช่นขนาดไฟล์ แต่ฉันไม่แน่ใจว่าคุณจะได้ขนาดภาพจริงหรือไม่
นี่คือบทความที่ฉันพบเกี่ยวกับคุณลักษณะ html 5 และวิธีแก้ไขปัญหาสำหรับ IE ที่เกี่ยวข้องกับการใช้ตัวควบคุม ActiveX http://jquerybyexample.blogspot.com/2012/03/how-to-check-file-size-before-uploading.html
ดังนั้นฉันจึงเริ่มทดลองใช้สิ่งต่างๆที่ FileReader API มีให้และสามารถสร้างแท็ก IMG ด้วย DATA URL
ข้อเสีย: ไม่สามารถใช้งานได้บนโทรศัพท์มือถือ แต่ทำงานได้ดีบน 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>
(ดูสิ่งนี้ใน jsfiddle ที่http://jsfiddle.net/eD2Ez/530/ )
(ดู jsfiddle ดั้งเดิมที่ฉันเพิ่มเข้าไปในhttp://jsfiddle.net/eD2Ez/ )
ตัวอย่างการตรวจสอบ jQuery ที่ใช้งานได้:
$(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));