1. 程式人生 > >小程式canvas繪製商品海報實現分享朋友圈

小程式canvas繪製商品海報實現分享朋友圈

小程式的canvas繪圖絕對是整個小程式開發中坑最多的了 。

先上效果圖:

實現步驟就是點選生成圖片 在canvas畫布中畫出一張海報 然後儲存在本地 在imags標籤中展示,此處儘可能的把canvas元件隱藏  但是不能用wx:if。 用hidden或者display屬性

<button bindtap='gotoSubmit'>生成圖片</button>
<!-- 彈框 -->
<view class='tankuang2' wx:if="{{showhaibao}}">
    <view class='container1' bindtap="previewImg">
          <image style="width:100%;height:80%"  src="{{imagePath}}" ></image>
    </view>
</view>
<canvas style="width:{{windowW}}px;height:{{windowH}}px;display:{{maskHidden?'none':''}}" canvas-id="mycanvas" />

css不做說明直接上程式碼


button{
    width: 100%;
    position: fixed;
    z-index: 1;
    bottom:0;
}
.tankuang2{
    height: 100%;
    width: 100%;
    background-color: rgba(0, 0, 0, 0.6);
    z-index: 999999;
    position: absolute;
    right: 0;
    bottom: 0;
    display: flex;
    align-items: center;
    justify-content: center;
}
.tankuang2 .container1{
    height: 90%;
    width: 90%;
    background-color:#FFF;

}

 第一大坑

我在js中註釋的程式碼很重要,實際開發中繪製商品海報必然是用網路圖片,但經過多次嘗試網路圖片是不可以直接繪製在canvas畫布上的,就必須要把他快取下來,弄一個本地路徑,此處我用本地圖片所以就註釋了

第二大坑    坑

經過多次測試發現當你第一次點選生成圖片的時候,它會生成一張透明的圖片,根本看不到,必須要點選兩次,就是呼叫兩次生成圖片的方法才可以看到生成的圖片,我這裡為了只讓他點選一次就生成圖片,在小程式生命週期函式onReady先呼叫一次 初始化一下圖片。

好了以下就是具體程式碼

Page({
    data: {
      showhaibao:false,//隱藏顯示
        maskHidden: true,//隱藏顯示
    },
    onLoad: function(options) {
        // 此處獲取裝置的寬高。canvas繪製的圖片以次寬高為準
        var _this = this;
        wx.getSystemInfo({
            success: function(res) {
                console.log(res)
                _this.setData({
                    windowW: res.windowWidth ,
                    windowH: res.screenHeight,
                   
                })
            },
        })
        
        // wx.downloadFile({
        //     url: 網路圖片地址必須要在小程式中配備合法域名,
        //     success: function (res1) {
        //         console.log(res1.tempFilePath)
        //         //快取商品圖片
        //         _this.setData({
        //             img1: res2.tempFilePath
        //         })
        //     }
        // })
        // wx.downloadFile({
        //     url: 網路圖片地址必須要在小程式中配備合法域名,
        //     success: function (res1) {
        //         console.log(res1.tempFilePath)
        //         //快取二維碼圖片
        //         _this.setData({
        //             img2: res2.tempFilePath
        //         })
        //     }
        // })
    },
    onReady: function() {
        // 頁面渲染完成
        this.createNewImg();
        //建立初始化圖片

    },

    //將金額繪製到canvas的固定
    setMoney: function(context) {
        var money ='¥29.9'
        context.setFontSize(24);
        context.setFillStyle("red");
        context.fillText(money, 40, 360);
        context.stroke();
    },
    //將說明繪製到canvas固定
    setSuoming :function(context){
        var Suoming="長按識別小程式碼訪問"
        context.setFontSize(18);
        context.setFillStyle("#484a3d");
        context.fillText(Suoming, 15, 460);
        context.stroke();
    },
    //將說明2繪製到canvas固定
    setSuoming1: function (context) {
        var Suoming = "子謙出品"
        context.setFontSize(18);
        context.setFillStyle("#484a3d");
        context.fillText(Suoming, 50, 510);
        context.stroke();
    },
    
    //將標題繪製到canvas的固定
    setName: function(context) {
        var name = "ONLY2018夏季新款蕾絲短袖連衣裙"
        context.setFontSize(15);
        context.setFillStyle("#67695b");
        context.fillText(name, 40, 320);
        context.stroke();
    },
    //將canvas轉換為圖片儲存到本地,然後將圖片路徑傳給image圖片的src
    createNewImg: function() {
        var _this = this;
        var context = wx.createCanvasContext("mycanvas");
        context.setFillStyle('#FFF')
        console.log(this.data.windowW, this.data.windowH)
        context.fillRect(0, 0, this.data.windowW, this.data.windowH)
        var path = "這裡放你的本地圖片路徑,或者網路圖片快取在本地的路徑";  //詳細看onLoad函式註釋部分
        context.drawImage(path, 30, 20, 300, 250);  //這裡是商品圖片
        this.setSuoming(context);
        this.setName(context);
        this.setMoney(context);
        this.setSuoming1(context);
        context.drawImage(path, 205, 430, 150, 150);//這裡是二維碼圖片
        context.draw(_this.getImg())

    },
    //將生成好的圖片儲存到本地  下面這句註釋是文件中的原話。
    // tip: 在 draw 回撥裡呼叫canvasToTempFilePath方法才能保證圖片匯出成功。
    getImg() {
        var _this = this;
        wx.canvasToTempFilePath({
            canvasId: 'mycanvas',
            success: function success(res) {
                _this.setData({
                    imagePath: res.tempFilePath,
                });
            }
        });
    },
    //點選圖片進行預覽,長按儲存分享圖片
    previewImg: function(e) {
        var img = this.data.imagePath
        wx.previewImage({
            current:img, // 當前顯示圖片的http連結
            urls: [img] // 需要預覽的圖片http連結列表
        })
    },
    gotoSubmit: function(e) {
        var _this=this
        this.setData({
            maskHidden:false,
            showhaibao:true
        })
        wx.showToast({
            title: '圖片生成中...',
            icon: 'loading',
            duration: 2000
        });
        setTimeout(function() {
            wx.hideToast()
            _this.createNewImg();
        }, 2000)

    }

})

以上就是canvas繪製商品海報的全部程式碼。希望能幫助到大家 ,有不懂的或者更好的方法,歡迎大家留言或者提問

相關推薦

程式canvas繪製商品海報實現分享朋友

小程式的canvas繪圖絕對是整個小程式開發中坑最多的了 。 先上效果圖: 實現步驟就是點選生成圖片 在canvas畫布中畫出一張海報 然後儲存在本地 在imags標籤中展示,此處儘可能的把canvas元件隱藏  但是不能用wx:if。 用hidden或者disp

程式學習--點選按鈕實現分享(元件複用)

首先,第一步,建立一個按鈕的元件,方便複用,當點選按鈕時候,會跳出是否授權的對話方塊: 元件的wxml程式碼: <button  bind:getuserinfo="onGetUserInfo" open-type="{{openType}}" plain="{{true}}

程式Canvas繪製圖片太大,自動閃退,安卓會有crash問題

問題說明; 目前小程式Canvas版本還有不少bug,效能較低。 對於圖片太大使用ctx.drawImage(imgpath, 0, 0, width, height, 0, 0, tempWidth, tempHeight); 方法會出現閃退或者黑屏。 當canvas尺寸過大,比如大於2000px以上

微信程式canvas繪製雷達圖

效果圖展示: 程式碼實現(具體實現): const DEFAULT_COLOR = '#FC9A00'; class Radar { constructor(options) { const { canvasId, width,

支付寶程式canvas繪製線上圖片失敗

最近在做一個支付寶小程式,需求是編輯圖片,包含縮放、旋轉、拖拽,編輯後的圖片需要上傳,採用了canvas繪圖並儲存圖片後上傳,繪圖的時候用本地的圖片沒有問題,換成線上圖片後,無法顯示。 解決辦法:把網路圖片轉換成本地路徑,再放進drawImage。 my.download

程式canvas繪製環形進度條

       最近微信小程式是真的很火!依稀還記得自己第一次寫android的環形對比圖(點選開啟連結),一晃兩年已經過去了。時間過得真快。第一次寫部落格的時候還是上大三的時候。現在已經工作將近三年了。最近半年由於工作的原因很少寫部落格,那麼現在同樣從環形圖開始擼小程式,廢話

程式canvas繪製倒計時

 效果展示: //廣告倒計時 advTimeCountDown:function(advTime){ var step = 1,//計數動畫次數 num = 0,//

微信程式canvas生成分享朋友海報

在公司遇到一個需求小程式分享到朋友圈,套路就是生成小程式的二維碼圖片,技術思路簡單點直接下載小程式二維碼的圖但是這麼簡單就不用多BB寫文章分享了,複雜點就是用canvas畫出一張圖片效果如下。 說一下解決過程吧 1.小程式canvas畫圖自己一點點畫需要不停的算東西而且

微信程式——點選商品分類跳轉到該商品商品詳情頁面(已實現

        首先,我不得不感慨下,慕課網上“7七月”老師的課真的很強大,此處放連結https://coding.imooc.com/learn/list/75.html。        我只是學習到了一半就開

微信程式canvas 圖片繪製

看其他人寫的程式碼出現的其中的imageResource的路徑是網路路徑,這個在手機端預覽是有問題的圖片是需要下載的  onShow: function () { const that = this; wx.downloadFile({ url: that.data.img,

程式js繪製海報

使用小程式畫布js程式碼如下: onLoad: function (options) { var that = this; //1. 請求後端API生成小程式碼 //that.getQr(); //2. canvas繪

微信程式自定義二維碼分享圖--Canvas畫圖及注意事項

    在一二月份做專案的時候,需要做一個微信小程式的自定義的二維碼,在此記錄與分享如何用Canvas畫圖怎麼自定義一個美觀的二維碼分享圖。     先展示下效果:     展示的是一個個人中心的

微信程式canvas合成圖片 分享

先要獲取圖片的資訊  然後將需要合成的內容用canvas繪製出來,得到一個合成好的畫布,接下來用 wx.canvasToTempFilePath 把當前畫布指定區域的內容匯出生成指定大小的圖片,並返回檔案路徑。這個時候的路徑 是微信的臨時路徑,瀏覽器是訪問不了的,因此需要請求

微信程式分享朋友實現思路與解決辦法

原文:http://www.wxapp-union.com/portal.php?mod=view&aid=3708簡介截止我寫這篇文章的時候,小程式應該是還沒有能夠直接分享到朋友圈的api,轉發給朋友和群是可以實現的,這篇文章主要是講如何實現分享到朋友圈,所以分享給

微信程序-canvas繪制文字實現自動換行

就是 creat 代碼 eas fun 一定的 文本 分割 func 在使用微信小程序canvas繪制文字時,時常會遇到這樣的問題:因為canvasContext.fillText參數為 我們只能設置文本的最大寬度,這就產生一定的了問題。如果我們繪制的文本長度不確定或者我

微信程式開發——使用wxParse外掛實現html程式碼的支援

前言: 大家都知道,無論是微信小程式還是支付寶小程式都不支援html程式碼的展示的,甚至說你想貼個純html程式碼做demo都不方便,更不用說解析html了。那麼怎麼解決這個問題呢? 解決方案: 使用WxParse外掛(微信小程式富文字解析元件)就能解決這個問題。本來這個外掛是專為微信小程式設計的,但是

在微信程式上,幫助中心介面實現類似手風琴案例

小程式wxml程式碼如下:  <block wx:for="{{arrdata}}" wx:key=""> <view class="centent_title" @tap="open_that" data-index="{{index}}">

微信程式自定義欄位實現選項的動態新增和刪除

問題描述: 在自定義選項中,點選新增選項按鈕,會出現一個選項的輸入框,輸入的選項可以通過點選左側的減號刪除 效果如圖: 解決過程: 1.首先寫出大體的框架。在pages下,建立了一個selfdefine的資料夾,在wxml中寫出靜態結構 selfdefine.wxml 說明

微信程式 canvas 問題

微信小程式 canvas 問題 問題描述 場景:當前頁面用 canvas 畫了個圖片,獲取到臨時路徑;之後再用這個臨時路徑去畫圖,手機上會出現畫不出來或者畫不全的情況;開發者工具沒問題。 解決方案 原因不明,小程式的問題,儘量避免這種場景,沒有找到解決方案

微信程式生成分享圖然後儲存圖片分享朋友

微信小程式可以實現快速的轉發好友實現分享,但是不能直接分享到朋友圈,但是有需要要這麼做,要怎麼實現呢? 檢視文件之後,大概有了實現思路 1.使用微信小程式的wx.createCanvasContext()方法,繪製圖片; 2.使用wx.canvasToTempFilePath()方法,把