最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue項(xiàng)目拍照或上傳圖片并實(shí)現(xiàn)轉(zhuǎn)化為base64格式

 更新時(shí)間:2023年11月17日 16:28:21   作者:鑰零零  
這篇文章主要介紹了vue項(xiàng)目拍照或上傳圖片并實(shí)現(xiàn)轉(zhuǎn)化為base64格式方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue項(xiàng)目拍照或上傳圖片并轉(zhuǎn)化為base64格式

需求

vue項(xiàng)目中,H5點(diǎn)擊按鈕觸發(fā)上傳圖片或拍照上傳,上傳的圖片使用base64位傳輸?shù)胶笈_(tái),最終實(shí)現(xiàn)身份證拍照識(shí)別功能。

實(shí)現(xiàn)過(guò)程

(1)設(shè)置一個(gè)按鈕和一個(gè)隱藏的input,點(diǎn)擊按鈕是觸發(fā)按鈕上傳圖片和拍照功能

<div>
   <input id="filePhoto" type="file"  ref="file" accept="image/*" hidden @change="onInputChange($event)" /> 
    <div @click="triggerUpload">
         <img src="@res/images/scenicSpots/add-circle-white.png" />
         <span>上傳圖片</span>
     </div>
</div>

(2)將上傳的圖片轉(zhuǎn)化為base64格式

//點(diǎn)擊圖片觸發(fā)文件上傳
triggerUpload() {
   $("#filePhoto").click();
},
//文件上傳到瀏覽器觸發(fā)事件
onInputChange(el) {
  var self = this;
  var file = el.target.files[0];
  console.log(file)
  var type = file.type.split('/')[0];
  if(type === 'image') {
    //將圖片轉(zhuǎn)化為base64
    var reader = new FileReader();
    reader.readAsDataURL(file); // readAsDataURL方法可以將上傳的圖片格式轉(zhuǎn)為base64,然后在存入到圖片路徑,
    reader.onload = function () {
        var image = reader.result;  // image即base64格式,后面調(diào)用后端請(qǐng)求傳入image
    }
  }else{
    self.$toast.showToast('請(qǐng)正確上傳圖片');
  }

},

vue圖片上傳組件,包括base64、二進(jìn)制上傳及圖片旋轉(zhuǎn)

最近做的vue項(xiàng)目中好多涉及到圖片上傳的,為了方便開(kāi)發(fā)就進(jìn)行了相關(guān)總結(jié)。

因?yàn)楣居泻枚囗?xiàng)目,并且使用的是不同后臺(tái)語(yǔ)言,有的需要通過(guò)base64字符串傳遞,有的需要轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)流傳遞,有的可以直接使用from表單進(jìn)行提交。后來(lái)有涉及到ios上拍照?qǐng)D片會(huì)旋轉(zhuǎn)的問(wèn)題,也一并進(jìn)行了封裝。

好了廢話不多說(shuō)直接上代碼。

<!DOCTYPE html>
<html>
 
<head>
    <meta charset="utf-8" />
    <title>圖片上傳</title>
</head>
 
<body>
    <form id="upImg">
        <input type='file' accept="image/*" name="avatar" placeholder="" id="img" />
    </form>
    <img src="" alt="" id='preImg'>
    <!-- 需要引入exif.js插件 -->
    <script src='./exif.js'></script>
    <script>
        
        var domImg = document.querySelector('#img')
        //添加DOM事件
        domImg.onchange = function upLoadImg(e, type) {
            let files = e.target.files || e.dataTransfer.files;
            if (!files.length) return;
            if (files[0].type.indexOf("image") < 0) {
                alert("上傳了非圖片");
                return;
            }
            if (files[0].size > 5 * 1000000) {
                alert("上傳文件過(guò)大");
                return;
            }
            
            // 圖片壓縮成base64
            compress(e.target, (base64, imgFile) => {
                var upImage = new FormData();
                upImage.append("fileName", imgFile.name);
                var blob = convertImgDataToBlob(base64);
                upImage.append("file", blob);
 
                //上傳圖片接口
                this.$http({
                    method: "POST",
                    url: interfaced.aliYun,
                    body: upImage
                }).then(
                    res => {
                        console.log(res);
                    },
                    err => {
                        console.log(err);
                    }
                );
            });
            
            //將base64轉(zhuǎn)換成二進(jìn)制函數(shù)
            function convertImgDataToBlob(base64Data) {
                var format = "image/jpeg";
                var base64 = base64Data;
                var code = window.atob(base64.split(",")[1]);
                var aBuffer = new window.ArrayBuffer(code.length);
                var uBuffer = new window.Uint8Array(aBuffer);
                for (var i = 0; i < code.length; i++) {
                    uBuffer[i] = code.charCodeAt(i) & 0xff;
                }
                var blob = null;
                try {
                    blob = new Blob([uBuffer], {
                        type: format
                    });
                } catch (e) {
                    window.BlobBuilder =
                        window.BlobBuilder ||
                        window.WebKitBlobBuilder ||
                        window.MozBlobBuilder ||
                        window.MSBlobBuilder;
                    if (e.name == "TypeError" && window.BlobBuilder) {
                        var bb = new window.BlobBuilder();
                        bb.append(uBuffer.buffer);
                        blob = bb.getBlob("image/jpeg");
                    } else if (e.name == "InvalidStateError") {
                        blob = new Blob([aBuffer], {
                            type: format
                        });
                    } else {}
                }
                return blob;
            }
            
            //將圖片壓縮成base64函數(shù)
            function compress(event, callback) {
                //圖片方向角
                var Orientation = null;
                var file = event.files[0];
                var reader = new FileReader();
 
                //獲取照片方向角屬性,用戶旋轉(zhuǎn)控制
                EXIF.getData(file, function() {
                    EXIF.getAllTags(this);
                    Orientation = EXIF.getTag(this, 'Orientation');
                });
 
                reader.onload = function (e) {
                    var image =document.createElement("img");
                    image.onload = function () {
                        //使用canvas重繪圖片
                        var canvas = document.createElement("canvas");
                        var x = this.width;
                        var y = this.height;
                        this.width = 375 * 2;
                        this.height = this.width / x * y;
                        var width = this.width;
                        var height = this.height;
                        canvas.width = this.width;
                        canvas.height = this.height;
                        var context = canvas.getContext("2d");
                        context.clearRect(0, 0, width, height);
                        //對(duì)圖片進(jìn)行旋轉(zhuǎn)
                        switch (Orientation) {
                            case 3:
                                context.rotate(180 * Math.PI / 180);
                                context.drawImage(this, -this.width, -this.height, this.width, this.height);
                                break;
                            case 6:
                                context.rotate(90 * Math.PI / 180);
                                context.drawImage(this, 0, -this.width, this.height, this.width);
                                break;
                            case 8:
                                context.rotate(270 * Math.PI / 180);
                                context.drawImage(this, -this.height, 0, this.height, this.width);
                                break;
                            case 2:
                                context.translate(this.width, 0);
                                context.scale(-1, 1);
                                context.drawImage(this, 0, 0, this.width, this.height);
                                break;
                            case 4:
                                context.translate(this.width, 0);
                                context.scale(-1, 1);
                                context.rotate(180 * Math.PI / 180);
                                context.drawImage(this, -this.width, -this.height, this.width, this.height);
                                break;
                            case 5:
                                context.translate(this.width, 0);
                                context.scale(-1, 1);
                                context.rotate(90 * Math.PI / 180);
                                context.drawImage(this, 0, -this.width, this.height, this.width);
                                break;
                            case 7:
                                context.translate(this.width, 0);
                                context.scale(-1, 1);
                                context.rotate(270 * Math.PI / 180);
                                context.drawImage(this, -this.height, 0, this.height, this.width);
                                break;
                            default:
                                context.drawImage(this, 0, 0, this.width,this.height);
                        }
 
                        var quality = 0.9; //壓縮程度
                        var data;
                        var result;
                        var length;
                        //控制圖片上傳的大小,注意若圖片過(guò)大 ajax上傳的時(shí)候會(huì)出現(xiàn)參數(shù)為null的錯(cuò)誤
                        //這里如果圖片過(guò)大會(huì)將圖片壓縮程度放大
                        do {
                            data = canvas.toDataURL("image/jpeg", quality);
                            length = data.length;
                            result = (length / 4 * 3 + 1023) / 1024; //計(jì)算壓縮后圖片的大小
                            quality -= 0.05;
                        } while (result > 450);
                        //data:base64
                        document.querySelector('#preImg').src = data
                        callback(data, event.files[0]);
                    };
                    image.src = e.target.result;
                };
                reader.readAsDataURL(file);
            }
        }
    </script>
</body>
 
</html>

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于Vue實(shí)現(xiàn)本地消息隊(duì)列MQ的示例詳解

    基于Vue實(shí)現(xiàn)本地消息隊(duì)列MQ的示例詳解

    這篇文章為大家詳細(xì)主要介紹了如何基于Vue實(shí)現(xiàn)本地消息隊(duì)列MQ, 讓消息延遲消費(fèi)或者做緩存,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2024-02-02
  • 小白教程|一小時(shí)上手最流行的前端框架vue(推薦)

    小白教程|一小時(shí)上手最流行的前端框架vue(推薦)

    這篇文章主要介紹了前端框架vue,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue開(kāi)發(fā)配置tsconfig.json文件的實(shí)現(xiàn)

    Vue開(kāi)發(fā)配置tsconfig.json文件的實(shí)現(xiàn)

    tsconfig.json文件中指定了用來(lái)編譯這個(gè)項(xiàng)目的根文件和編譯選項(xiàng),本文就來(lái)介紹一下Vue開(kāi)發(fā)配置tsconfig.json文件的實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08
  • Element-UI中關(guān)于table表格的那些騷操作(小結(jié))

    Element-UI中關(guān)于table表格的那些騷操作(小結(jié))

    這篇文章主要介紹了Element-UI中關(guān)于table表格的那些騷操作(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解用vue-cli來(lái)搭建vue項(xiàng)目和webpack

    詳解用vue-cli來(lái)搭建vue項(xiàng)目和webpack

    本篇文章主要介紹了詳解用vue-cli來(lái)搭建vue項(xiàng)目和webpack,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Vue實(shí)現(xiàn)大屏獲取當(dāng)前所處城市及當(dāng)?shù)靥鞖獾木唧w方案

    Vue實(shí)現(xiàn)大屏獲取當(dāng)前所處城市及當(dāng)?shù)靥鞖獾木唧w方案

    文章介紹了如何在大屏項(xiàng)目中展示城市名稱(chēng)和實(shí)時(shí)天氣信息,通過(guò)瀏覽器的GeolocationAPI獲取經(jīng)緯度,然后使用逆地理編碼服務(wù)獲取城市名稱(chēng),文章還提到了使用Open-Meteo獲取天氣信息,該服務(wù)免費(fèi)且支持全球經(jīng)緯度的實(shí)時(shí)天氣和未來(lái)7天預(yù)報(bào),需要的朋友可以參考下
    2026-02-02
  • Vue3使用md-editor-v3的實(shí)例解讀markdown文本

    Vue3使用md-editor-v3的實(shí)例解讀markdown文本

    本文介紹了如何在Vue3項(xiàng)目中使用md-editor-v3實(shí)現(xiàn)Markdown編輯器,包括基礎(chǔ)實(shí)現(xiàn)、工具欄自定義、預(yù)覽功能以及擴(kuò)展功能
    2026-01-01
  • 解決axios發(fā)送post請(qǐng)求返回400狀態(tài)碼的問(wèn)題

    解決axios發(fā)送post請(qǐng)求返回400狀態(tài)碼的問(wèn)題

    今天小編就為大家分享一篇解決axios發(fā)送post請(qǐng)求返回400狀態(tài)碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 如何在 Vue 表單中處理圖片

    如何在 Vue 表單中處理圖片

    這篇文章主要介紹了如何在 Vue 表單中處理圖片,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2021-01-01
  • vscode搭建vue環(huán)境完整圖文教程(適合新手小白)

    vscode搭建vue環(huán)境完整圖文教程(適合新手小白)

    Vue框架的優(yōu)秀設(shè)計(jì)和強(qiáng)大的生態(tài)系統(tǒng)成為了越來(lái)越多開(kāi)發(fā)者選擇Vue的原因,在實(shí)際項(xiàng)目過(guò)程中一個(gè)高效的開(kāi)發(fā)環(huán)境能夠大大提高開(kāi)發(fā)效率,這篇文章主要給大家介紹了關(guān)于vscode搭建vue環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

汉阴县| 桂东县| 蒙自县| 中西区| 西乡县| 龙川县| 南部县| 吴忠市| 分宜县| 册亨县| 乌鲁木齐市| 红安县| 咸阳市| 连南| 玉门市| 上虞市| 长岭县| 桐城市| 鲁山县| 广州市| 普陀区| 山阴县| 那曲县| 祥云县| 建阳市| 通渭县| 太和县| 偃师市| 灵丘县| 红原县| 东山县| 乐东| 广饶县| 泽州县| 蕲春县| 青河县| 江陵县| 普洱| 鹰潭市| 吴旗县| 涞水县|