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

VUE微信H5生成二維碼海報保存在本地相冊的實現(xiàn)

 更新時間:2022年06月08日 08:39:34   作者:不許動一二三  
本文主要介紹了VUE微信H5生成二維碼海報保存在本地相冊的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

一、效果

二、說明

公司需求:宣傳海報從后臺獲取,二維碼地址也從后臺獲得,然后生成一個海報,海報上固定位置放二維碼,長按圖片可以保存在本地相冊(其實前面的需求是點擊按鈕,下載海報圖到本地相冊,然后h5下載的實現(xiàn)原理是生成一個a標簽鏈接,然后下載,在電腦模擬器可以下載,在微信瀏覽器一點反應沒有,所以退一步,長按保存),下面是使用版本,UI插件用的是vant(有贊)

  • vue:“^2.6.11”,
  • “html2canvas”: “1.4.1”,
  • “vant”: “^2.8.1”,
  • “vue_qrcodes”: “^1.1.3”

三、思路

從后端獲取海報圖,獲取二維碼鏈接,然后將二維碼定位到圖片固定位置,最后通過html2canvas生成canvas,然后通過canvas.toDataURL(“image/png”)生成

四、效果

從第三張圖就可以看到長按保存的就是帶有二維碼的海報圖了

五、代碼實現(xiàn)

實現(xiàn)的原理就是:先把二維碼定位到海報圖上,然后通過html2canvas生成帶二維碼的海報,最后用這個圖片覆蓋在imageWrapper1元素上,才能下載到帶二維碼的海報圖,這也是為什么要等待框顯示正在生成海報圖。

<template> <!--子組件-->
    <div class="posterpopup">
        <van-popup v-model="popupVisible" @closed="closePopup">
            <div id="imageWrapper1">
                <img
                    class="posterpopup-img"
                    :src="popupObj.posterurl || popupObj.photourl"
                />
                <div class="qrcode1" ref="qrcode" id="imageWrapper">
                    <qrcode
                        :url="qrUrl"
                        colorDark="#000"
                        colorLight="#fff"
                        :wid="wid"
                        :hei="wid"
                        :imgwid="imgwid"
                        :imghei="imgwid"
                    ></qrcode>
                </div>
            </div>
            <div class="posterpopup-img1" v-if="posterUrl">
                <img :src="posterUrl" id="posterUrl" />
            </div>
            <div class="posterpopup-wrap">
                <img src="@/assets/image/download.png" alt="" />
                <div class="wrap-text">長按保存圖片</div>
            </div>
        </van-popup>
    </div>
</template>

<script>
import qrcode from "vue_qrcodes";
import html2canvas from "html2canvas";
export default {
    name: "PosterPopup",
    props: {
        popupVisible: false,
        popupObj: {
            type: Object,
            default: {},
        },
        qrUrl: "",
    },
    components: {
        qrcode,
    },
    data() {
        return {
            imgwid: 30, // 二維碼logo寬度
            wid: 80, // 二維碼寬度
            wrapWid: 80, // 外邊框?qū)挾?
            posterUrl: "",
            controllShow: true,
        };
    },
    methods: {
        closePopup() {
            this.posterUrl = ''
            this.$emit("closePopup");
        },
        toSaveImage() {
            // 保存圖片
            this.$nextTick(async () => {
                var imageWrapper = document.getElementById("imageWrapper1");
                try {
                    let canvas = await html2canvas(imageWrapper, {
                        height: imageWrapper.offsetHeight,
                        width: imageWrapper.offsetWidth,
                        backgroundColor: null,
                        useCORS: true,
                        allowTaint: true,
                        scrollX: 0,
                        scrollY: 0,
                        dpi: window.devicePixelRatio * 2,
                        //  dpi: 300
                    });
                    this.controllShow = false;
                    this.posterUrl = canvas.toDataURL("image/png");
                    this.$Toast.clear();
                } catch (err) {}
            });
        },
        dataURLToBlob(dataurl) {
            let arr = dataurl.split(",");
            let mime = arr[0].match(/:(.*?);/)[1];
            let bstr = atob(arr[1]);
            let n = bstr.length;
            let u8arr = new Uint8Array(n);
            while (n--) {
                u8arr[n] = bstr.charCodeAt(n);
            }
            return new Blob([u8arr], { type: mime });
        },
    },
    watch: {
        popupVisible(newVal, oldVal) {
            if (newVal) {
                this.$Toast.loading({
                    message: "海報生成中,請稍等",
                    duration: 0,
                    className: "zIndex",
                });
                this.$nextTick(() => {
                    this.toSaveImage();
                });
            } else {
                this.controllShow = true;
                this.$Toast.clear();
            }
        },
    },
};
</script>


<style lang="scss" scoped>
.posterpopup {
    .van-popup {
        background-color: transparent;
        overflow-y: hidden;
        width: 568px;
        height: 90vh;
    }
    #imageWrapper1 {
        position: absolute;
        min-width: 568px;
        min-height: 990px;
    }
    .posterpopup-img {
        width: 568px;
        height: 100%;
    }
    .posterpopup-img1 {
        width: 568px;
        height: 990px;
        & img {
            width: 100%;
            height: 13.2rem;
        }
    }
    .posterpopup-wrap {
        position: absolute;
        width: 302px;
        height: 70px;
        bottom: 50px;
        left: 50%;
        transform: translateX(-50%);
        // margin-top: 100px;
        margin: 39px auto 0;
        & > img {
            width: 100%;
            height: 100%;
        }
        .wrap-text {
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            right: 30px;
            font-size: 30px;
            color: #fff;
        }
    }
    #imageWrapper {
        position: absolute;
        right: 30px;
        bottom: 35px;
    }
    #posterUrl {
        position: absolute;
        z-index: 2002;
        top: 0;
        left: 0;
        right: 0;
        bottom: 90px;
        margin: 0 auto;
        width: 568px;
    }
}
</style>
<!---->
<posterPopup :popupVisible="popupVisible" :popupObj="popupObj" @closePopup="closePopup" :qrUrl="qrUrl"></posterPopup>

六、遇到的問題

1.如果你把海報放到云上(騰訊云,阿里云,七牛云),就是放在CDN上,那么云一定要設(shè)置以下的頭文件,如果你不設(shè)置這個頭文件,就有跨域問題,你就一直會生成不成功,實用html2canvas的話只能生成一個空白背景的二維碼,這個搞了好久,采用了放在服務(wù)器本地,但是服務(wù)器本地圖片下載又慢,影響體驗,搞了幾天,才知道一定要設(shè)置?。?!

到此這篇關(guān)于VUE微信H5生成二維碼海報保存在本地相冊的文章就介紹到這了,更多相關(guān)VUE微信H5生成二維碼海報保存在本地相冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue實現(xiàn)表格批量審核功能實例代碼

    Vue實現(xiàn)表格批量審核功能實例代碼

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)表格批量審核功能實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • vue-cropper組件實現(xiàn)圖片切割上傳

    vue-cropper組件實現(xiàn)圖片切割上傳

    這篇文章主要為大家詳細介紹了vue-cropper組件實現(xiàn)圖片切割上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • 完美解決axios在ie下的兼容性問題

    完美解決axios在ie下的兼容性問題

    下面小編就為大家分享一篇完美解決axios在ie下的兼容性問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • el-table實現(xiàn)嵌套表格的展示功能(完整代碼)

    el-table實現(xiàn)嵌套表格的展示功能(完整代碼)

    el-table中在嵌套一個el-table,這樣數(shù)據(jù)格式就沒問題了,主要就是樣式,將共同的列放到一列中,通過渲染自定義表頭render-header,將表頭按照合適的寬度渲染出來,本文給大家分享el-table實現(xiàn)嵌套表格的展示功能,感興趣的朋友一起看看吧
    2024-02-02
  • 基于Vue3實現(xiàn)一個小相冊詳解

    基于Vue3實現(xiàn)一個小相冊詳解

    這篇文章主要為大家詳細介紹了如何基于Vue3實現(xiàn)一個小相冊效果,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-12-12
  • 在vue中實現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測有效)

    在vue中實現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測有效)

    這篇文章主要介紹了在vue中實現(xiàn)清除echarts上次保留的數(shù)據(jù)(親測有效),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue3實現(xiàn)密碼輸入框效果的示例代碼

    vue3實現(xiàn)密碼輸入框效果的示例代碼

    這篇文章主要為大家詳細介紹了如何利用vue3實現(xiàn)6位的密碼輸入框效果,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-08-08
  • 詳解Vuex中g(shù)etters的使用教程

    詳解Vuex中g(shù)etters的使用教程

    在Store倉庫里,state就是用來存放數(shù)據(jù)。如果很多組件都使用這個過濾后的數(shù)據(jù),我們是否可以把這個數(shù)據(jù)抽提出來共享?這就是getters存在的意義。我們可以認為,getters是store的計算屬性。本文將具體介紹一下getters的使用教程,需要的可以參考一下
    2022-01-01
  • Vue啟動失敗報錯:Module?not?found:?Error:?Can‘t?resolve?'less-loader'解決

    Vue啟動失敗報錯:Module?not?found:?Error:?Can‘t?resolve?&apos

    這篇文章主要給大家介紹了關(guān)于Vue啟動失敗報錯:Module?not?found:?Error:?Can‘t?resolve?'less-loader'解決的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • vue3觸發(fā)父組件兩種寫法

    vue3觸發(fā)父組件兩種寫法

    這篇文章主要介紹了vue3觸發(fā)父組件兩種寫法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08

最新評論

兴隆县| 龙里县| 永宁县| 宝兴县| 武安市| 临夏县| 云林县| 延吉市| 芮城县| 白朗县| 抚顺市| 江山市| 松桃| 文成县| 沂南县| 靖江市| 凤阳县| 西乌珠穆沁旗| 周口市| 金湖县| 绥芬河市| 社会| 项城市| 潮安县| 沁阳市| 任丘市| 牡丹江市| 金乡县| 酒泉市| 兰溪市| 勃利县| 威远县| 曲周县| 商南县| 涞水县| 永济市| 社会| 慈溪市| 哈巴河县| 鸡东县| 三明市|