1. 程式人生 > >canvas上掃碼之在部分安卓機上識別不出,無法跳轉公眾號解決方式

canvas上掃碼之在部分安卓機上識別不出,無法跳轉公眾號解決方式

這段時間在做一個分享的頁面,其中有一個步驟就是

1.需要將服務端的幾張圖片合成一張圖片;

2.幾種圖片中包含了二維碼資訊;

3.二維碼的資訊展示在右下角。

合成圖片的過程就是呼叫了canvas的API,程式碼如下:

_buildImages(config, callback) {
            CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
                var min_size = Math.min(w, h);
                if (r > min_size / 2) r = min_size / 2;
                // 開始繪製
                this.beginPath();
                this.moveTo(x + r, y);
                this.arcTo(x + w, y, x + w, y + h, r);
                this.arcTo(x + w, y + h, x, y + h, r);
                this.arcTo(x, y + h, x, y, r);
                this.arcTo(x, y, x + w, y, r);
                this.stroke();
                this.closePath();
                return this;
            }


            // 使用canvas
            let myCanvas = document.createElement("canvas");
            myCanvas.style.backgroundColor = 'transparent';
            myCanvas.width = config.width;
            myCanvas.height = config.height;


            let context = myCanvas.getContext("2d");


            context.save();
            // 圖片的image物件放回原來的陣列中。
            let items = config.items;
            for (let i = 0; i < items.length; i++) {
                let item = items[i];


                let img = new Image();
                img.crossOrigin = "anonymous";
                img.src = item.src; 
                item.imageObj = img;


            }


            // 定時判斷圖片是否載入完成
            let window_setThree = window.setInterval(function() {
                //圖片是否全部加在完成的標誌
                let allReady = true;


                //判斷圖片是否全部加在完成
                for (let i = 0; i < items.length; i++) {
                    let image = items[i].imageObj;
                    allReady = allReady && image.complete
                }


                // 拼接圖片,輸出dataUrl     
                if (allReady) {
                    clearInterval(window.clearInterval(window_setThree));


                    for (let i = 0; i < items.length; i++) {
                        let item = items[i];
                        //處理服務端傳過來沒有頭像的問題
                        if(!config.items[i].src){
                            continue;
                        }


                        if(i == 1){


                            context.save();


                           var pattern = context.createPattern(item.imageObj, "no-repeat");
                            context.roundRect(item.xpw * config.width, item.yph * config.height, item.wpw * config.width, item.hph * config.height, item.hph * config.height/2);
                            context.fillStyle = pattern;
                            context.fill();
                            context.clip();
                            context.drawImage(item.imageObj, item.xpw * config.width, item.yph * config.height, item.wpw * config.width, item.hph * config.height); 
                            context.restore(); // 還原狀態
                        }else{
                            context.drawImage(item.imageObj, item.xpw * config.width, item.yph * config.height, item.wpw * config.width, item.hph * config.height);
                        }
                       
                    }


                    context.save();


                    let canvasSrc = myCanvas.toDataURL("image/png");


                    if (callback && callback instanceof Function) {
                        callback(canvasSrc)
                    }
                }
            }, 50);
        }

這一切都挺順利得完成了,iOS基本上都可以識別上面的二維碼資訊,並且跳轉到對應的公眾號去,但是安卓卻時好時不好,讓人傷腦筋。

經過一個下午的除錯,排除不可能的因素,一開始以為是二維碼的位置關係,的確調整了位置,可以被掃出,但是跳轉的連結不知道為何不正確,難倒是微信處理了?(此處有一個疑問)

於是,除錯了另一種方案,直接放二維碼連結,不經過canvas,很和諧得跳轉到了我們想要其跳轉的位置,排除了連結返回有問題的可能。

接下來,嘗試得把canvas最後轉為base64圖片的格式修改為jpeg後,才發現,安卓機神奇得都可以跳轉了。(這是經過一番周折的嘗試結果,具體為何還沒有結論)


以上內容,希望對遇到相同問題的同學給到幫助!