基于JS實(shí)現(xiàn)前端壓縮上傳圖片的實(shí)例代碼
具體代碼如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>前端壓縮上傳圖片</title>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<input type="file" id="picFile" onchange="readFile(this)" />
<img id="img" src="" alt="" />
<script>
function readFile(obj) {
var file = obj.files[0];
//判斷類型是不是圖片
if (!/image\/\w+/.test(file.type)) {
alert("請(qǐng)確保文件為圖像類型");
return false;
}
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e) {
dealImage(this.result, { quality: 0.5 }, function(base) {
//調(diào)用
var blob = dataURLtoBlob(base);
var newFile = new File([blob], file.name, { type: file.type });
console.log(newFile)
let r = new FileReader(); //本地預(yù)覽
r.onload = function() {
$('#img').attr("src", r.result);;
}
r.readAsDataURL(newFile); //Base64
// upload(newFile);
});
}
}
//將base64轉(zhuǎn)換為blob
function dataURLtoBlob(dataurl) {
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
function upload(file) {
var that = this;
// 創(chuàng)建form對(duì)象
let param = new FormData();
// 通過append向form對(duì)象添加數(shù)據(jù)
param.append('img', file);
// 文件大小
param.append('size', file.size);
for (var n in that.params) {
param.append(n, that.params[n]);
}
// 創(chuàng)建ajax
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(xhr.responseText)
}
xhr.open("POST", "yourapi", true);
// 發(fā)送表單數(shù)據(jù)
xhr.send(param);
}
/**
* 圖片壓縮,默認(rèn)同比例壓縮
* @param {Object} path
* pc端傳入的路徑可以為相對(duì)路徑,但是在移動(dòng)端上必須傳入的路徑是照相圖片儲(chǔ)存的絕對(duì)路徑
* @param {Object} obj
* obj 對(duì)象 有 width, height, quality(0-1)
* @param {Object} callback
* 回調(diào)函數(shù)有一個(gè)參數(shù),base64的字符串?dāng)?shù)據(jù)
*/
function dealImage(path, obj, callback) {
var img = new Image();
img.src = path;
img.onload = function() {
var that = this;
// 默認(rèn)按比例壓縮
var w = that.width,
h = that.height,
scale = w / h;
w = obj.width || w;
h = obj.height || (w / scale);
var quality = obj.quality || 0.7; // 默認(rèn)圖片質(zhì)量為0.7
//生成canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
// 創(chuàng)建屬性節(jié)點(diǎn)
var anw = document.createAttribute("width");
anw.nodeValue = w;
var anh = document.createAttribute("height");
anh.nodeValue = h;
canvas.setAttributeNode(anw);
canvas.setAttributeNode(anh);
ctx.drawImage(that, 0, 0, w, h);
// 圖像質(zhì)量
if (obj.quality && obj.quality <= 1 && obj.quality > 0) {
quality = obj.quality;
}
// quality值越小,所繪制出的圖像越模糊
var base64 = canvas.toDataURL('image/jpeg', quality);
// 回調(diào)函數(shù)返回base64的值
callback(base64);
}
}
</script>
</body>
</html>
總結(jié)
以上所述是小編給大家介紹的基于JS實(shí)現(xiàn)前端壓縮上傳圖片的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
javascript適合移動(dòng)端的日期時(shí)間拾取器
這篇文章主要介紹了javascript適合移動(dòng)端的日期時(shí)間拾取器,提供了友好的日期和時(shí)間選擇操作界面,需要的朋友可以參考下2015-11-11
JS實(shí)現(xiàn)網(wǎng)頁上隨滾動(dòng)條滾動(dòng)的層效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)網(wǎng)頁上隨滾動(dòng)條滾動(dòng)的層效果代碼,涉及JavaScript頁面元素屬性的獲取、運(yùn)算及設(shè)置等操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11
JavaScript中arguments和this對(duì)象用法分析
這篇文章主要介紹了JavaScript中arguments和this對(duì)象用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了arguments對(duì)象和this對(duì)象的功能、常見用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08
使用Bootstrap Tabs選項(xiàng)卡Ajax加載數(shù)據(jù)實(shí)現(xiàn)
這篇文章主要介紹了使用Bootstrap Tabs選項(xiàng)卡Ajax加載數(shù)據(jù)實(shí)現(xiàn),以及遇到的問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
javascript用函數(shù)實(shí)現(xiàn)對(duì)象的方法
這篇文章主要介紹了javascript用函數(shù)實(shí)現(xiàn)對(duì)象的方法,涉及javascript函數(shù)使用技巧,需要的朋友可以參考下2015-05-05

