摘要:最近項(xiàng)目中的一個(gè)基礎(chǔ)功能手機(jī)上傳圖片技術(shù)棧利用進(jìn)行壓縮這個(gè)應(yīng)該都比較熟悉利用獲取照片旋轉(zhuǎn)角度屬性,因?yàn)橛行┦謾C(jī)機(jī)型會(huì)因?yàn)榕恼諘r(shí)手機(jī)的方向使拍的照片帶一個(gè)旋轉(zhuǎn)角度的屬性核心代碼照片角度屬性創(chuàng)建臨時(shí)畫布等比壓縮旋轉(zhuǎn)度旋轉(zhuǎn)度旋轉(zhuǎn)
最近項(xiàng)目中的一個(gè)基礎(chǔ)功能-----手機(jī)上傳圖片
技術(shù)棧:
1、利用canvas進(jìn)行壓縮(這個(gè)應(yīng)該都比較熟悉)
2、利用exif-js獲取照片旋轉(zhuǎn)角度屬性,因?yàn)橛行┦謾C(jī)機(jī)型會(huì)因?yàn)榕恼諘r(shí)手機(jī)的方向使拍的照片帶一個(gè)旋轉(zhuǎn)角度的屬性
核心代碼:
var _orientation; //照片角度屬性 EXIF.getData(fileInput, function () { _orientation = EXIF.getTag(fileInput, "Orientation"); }); let reader = new FileReader(); reader.readAsDataURL(fileInput); reader.onload = function (e) { var image = new Image(); image.src = e.target.result; image.onload = function () { var canvas = document.createElement("canvas"); //創(chuàng)建臨時(shí)畫布 var _width = this.width, _height = this.height, _ratio = _height / _width; //等比壓縮 if (this.width > 800) { _width = 800; _height = 800 * _ratio; } canvas.width = _width; canvas.height = _height; var ctx = canvas.getContext("2d"); switch (_orientation) { case 6: // 旋轉(zhuǎn)90度 canvas.width = _height; canvas.height = _width; ctx.rotate(Math.PI / 2); ctx.drawImage(this, 0, -_height, _width, _height); break; case 3: // 旋轉(zhuǎn)180度 ctx.rotate(Math.PI); ctx.drawImage(this, -_width, -_height, _width, _height); break; case 8: // 旋轉(zhuǎn)-90度 canvas.width = _height; canvas.height = _width; ctx.rotate(3 * Math.PI / 2); ctx.drawImage(this, -_width, 0, _width, _height); break; default: ctx.drawImage(this, 0, 0, _width, _height); } //需要上傳的數(shù)據(jù)對(duì)象 const resultBase =dataURItoBlob(canvas.toDataURL("image/jpeg", 0.9)); //...省略進(jìn)行上傳操作代碼 }; } //將dataURI轉(zhuǎn)成Blob用于上傳 dataURItoBlob:function(dataURI) { // convert base64/URLEncoded data component to raw binary data held in a string var byteString; if (dataURI.split(",")[0].indexOf("base64") >= 0) byteString = atob(dataURI.split(",")[1]); else byteString = unescape(dataURI.split(",")[1]); // separate out the mime component var mimeString = dataURI.split(",")[0].split(":")[1].split(";")[0]; // write the bytes of the string to a typed array var ia = new Uint8Array(byteString.length); for (var i = 0; i < byteString.length; i++) { ia[i] = byteString.charCodeAt(i); } return new Blob([ia], {type:mimeString}); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/103051.html
摘要:上周做一個(gè)關(guān)于移動(dòng)端圖片壓縮上傳的功能。利用,進(jìn)行圖片的壓縮,得到圖片的的值上傳文件。 上周做一個(gè)關(guān)于移動(dòng)端圖片壓縮上傳的功能。期間踩了幾個(gè)坑,在此總結(jié)下。 大體的思路是,部分API的兼容性請(qǐng)參照caniuse: 利用FileReader,讀取blob對(duì)象,或者是file對(duì)象,將圖片轉(zhuǎn)化為data uri的形式。 使用canvas,在頁(yè)面上新建一個(gè)畫布,利用canvas提供的API,...
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁(yè)面樣式,圖片壓縮和預(yù)覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗(yàn),可以對(duì)圖片進(jìn)行一下壓縮和本地預(yù)覽。 一、通過(guò)Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過(guò)表單自有屬性進(jìn)行提交,看似簡(jiǎn)單,但是也有其最大的缺點(diǎn),那就是提交...
摘要:哈哈主要還是我嫌麻煩四上傳圖片這里的頁(yè)面樣式,圖片壓縮和預(yù)覽都和上面一樣,這里我主要配置一下的,讓接口能夠成功上傳。如果想讓用戶有更好的體驗(yàn),可以對(duì)圖片進(jìn)行一下壓縮和本地預(yù)覽。 一、通過(guò)Form表單提交上傳 HTML enctype屬性必不可少 上面一種方法通過(guò)表單自有屬性進(jìn)行提交,看似簡(jiǎn)單,但是也有其最大的缺點(diǎn),那就是提交...
摘要:我用做狀態(tài)管理,七牛云做圖床。關(guān)于該組件的其他用法可以在的官方文檔查閱上傳對(duì)圖片進(jìn)行壓縮壓縮圖片的質(zhì)量對(duì)圖片進(jìn)行壓縮壓縮圖片實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。前端向后端請(qǐng)求上傳。 我用vuex做狀態(tài)管理,七牛云做圖床。 項(xiàng)目地址:多圖片上傳組件 效果展示 showImg(https://segmentfault.com/img/bVbocgG?w=960&h=516); 項(xiàng)目執(zhí)行流程 首先,讓我們來(lái)分...
摘要:背景作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問(wèn)題的時(shí)候,都會(huì)虎軀一震,以為會(huì)是一個(gè)棘手的問(wèn)題,當(dāng)你讀完這篇文章的時(shí)候,你會(huì)發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡(jiǎn)單 背景 作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時(shí)候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個(gè)問(wèn)題的時(shí)候,都會(huì)虎...
閱讀 825·2021-10-13 09:39
閱讀 3703·2021-10-12 10:12
閱讀 1757·2021-08-13 15:07
閱讀 1015·2019-08-29 15:31
閱讀 2890·2019-08-26 13:25
閱讀 1783·2019-08-23 18:38
閱讀 1886·2019-08-23 18:25
閱讀 1862·2019-08-23 17:20