目錄
分享利用HTML5實作圖片壓縮上傳的實例程式碼
實作流程:
取得上傳的檔案;
- ##使用FileReader讀取圖片,並新建一個Image物件將FileReader讀取的圖片資料放進去;
- #使用canvas將Image物件等比縮放並寫入到畫布中,儲存為base64格式的資料(這裡使用的是FormData物件上傳,其實這裡已經可以直接將base64的資料透過ajax使用post方法上傳到伺服器,即可避免下面兩個步驟);
- 新建一個Blob物件將base64資料放入;
- 使用FormData物件上傳到第三方雲端儲存伺服器;
- accept設定上傳檔案的類型,這裡直接用image/*,不指定具體的後綴名,否則部分安卓手機下無法上傳圖片;
- 新增multiple
- capture="camera"屬性可以呼叫相機(新增此屬性在iPhone下會直接呼叫相機,而不會讀取相簿;且目前安卓和ios裝置使用accept="image/*"均可選擇使用相機拍照或使用相簿的圖片,所以該屬性可以忽略)。
<input id="imgUpload" type="file" onchange="addPic" accept="image/*" />
登入後複製
事件後取得上傳的檔案function addPic(e){
if (typeof FileReader === 'undefined') {
return alert('你的浏览器不支持上传图片哟!');
}
var files = e.target.files || e.dataTransfer.files;
if(files.length > 0){
imgResize(file[0], callback);
}
}
登入後複製
使用FileReader取得圖片數據,並使用canvas壓縮function addPic(e){ if (typeof FileReader === 'undefined') { return alert('你的浏览器不支持上传图片哟!'); } var files = e.target.files || e.dataTransfer.files; if(files.length > 0){ imgResize(file[0], callback); } }
登入後複製
- #ios手機拍照會旋轉90度,這裡必須判斷是否ios手機做出相應處理後再上傳
function imgResize(file, callback){ var fileReader = new FileReader(); fileReader.onload = function(){ var IMG = new Image(); IMG.src = this.result; IMG.onload = function(){ var w = this.naturalWidth, h = this.naturalHeight, resizeW = 0, resizeH = 0; // maxSize 是压缩的设置,设置图片的最大宽度和最大高度,等比缩放,level是报错的质量,数值越小质量越低 var maxSize = { width: 500, height: 500, level: 0.6 }; if(w > maxSize.width || h > maxSize.height){ var multiple = Math.max(w / maxSize.width, h / maxSize.height); resizeW = w / multiple; resizeH = w / multiple; } else { // 如果图片尺寸小于最大限制,则不压缩直接上传 return callback(file) } var canvas = document.createElement('canvas'), ctx = canvas.getContext('2d'); if(window.navigator.userAgent.indexOf('iPhone') > 0){ canvas.width = resizeH; canvas.height = resizeW; ctx.rorate(90 * Math.PI / 180); ctx.drawImage(IMG, 0, -resizeH, resizeW, resizeH); }else{ canvas.width = resizeW; canvas.height = resizeH; ctx.drawImage(IMG, 0, 0, resizeW, resizeH); } var base64 = canvas.toDataURL('image/jpeg', maxSize.level); convertBlob(window.atob(base64.split(',')[1]), callback); } }; fileReader.readAsDataURL(file); }
登入後複製
- 安卓手機不支援Blob #
function convertBlob(base64, callback){ var buffer = new ArrayBuffer(base64.length); var ubuffer = new Uint8Array(buffer); for (var i = 0; i < base64.length; i++) { ubuffer[i] = base64.charCodeAt(i) } var blob; try { blob = new Blob([buffer], {type: 'image/jpg'}); } catch (e) { window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; if(e.name === 'TypeError' && window.BlobBuilder){ var blobBuilder = new BlobBuilder(); blobBuilder.append(buffer); blob = blobBuilder.getBlob('image/jpg'); } } callback(blob) }
登入後複製
HTML5的FormData物件上傳資料function callback(fileResize){
var data = new FormData();
data.append('file', fileResize);
var config = {
headers: {'Content-Types': 'multipart/form-data'}
};
// 这里用的es6语法发起请求,可以无视
axios.post(url, data, config).then().catch(e){}
}
登入後複製【相關推薦】
#1.2. 3.
function callback(fileResize){ var data = new FormData(); data.append('file', fileResize); var config = { headers: {'Content-Types': 'multipart/form-data'} }; // 这里用的es6语法发起请求,可以无视 axios.post(url, data, config).then().catch(e){} }
登入後複製
以上是分享利用HTML5實作圖片壓縮上傳的實例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌
刺客信條陰影:貝殼謎語解決方案
2 週前
By DDD
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前
By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
