-卡牌+動態資訊長按儲存圖片注意點~

小仙女敲程式碼發表於2018-12-13

一.需求

需求先定好,頁面展示什麼元素,和產品先核對好
1.端內答題 得到結果,結果頁上面沒有二維碼和長按儲存提示(因為端內不支援)。點選喚起分享平臺分享出去是卡牌。
2.端外和端內一樣的答題流程。答完題得到結果頁,長按儲存圖片,儲存圖片有使用者的暱稱和頭像。

-卡牌+動態資訊長按儲存圖片注意點~

二·客戶端卡牌分享注意點

let Y = window.pt === 'adr' ? 930 : 910; 
// ios和安卓對於軸的文字定位的偏差,ios符合設計稿尺寸
Local.shareStyleImage(
          this.bgURL,  //必填 放背景圖片,分享的卡牌大小是由此背景圖片決定。
          [   // 定位在頁面的圖片陣列,可以放置多個。[]必傳;
            {
              url: this.qrURL, //圖片地址
              location: { x: 502, y: 850 }, // 定位的位置,參考絕對定位方法。
              width: 135, // 圖片寬度
              height: 135 // 圖片高度
            }
          ],  
          [ // 放定位文字的陣列,[]必傳,ios666/667的安裝包必須
          要把text的引數寫上。安卓666/667可以不穿
            {
              text: `長按掃碼,做套題壓壓驚`,
              location: {x: 390, y: Y},
              color: "ffffff", // 注意這裡沒有# 
              fontSize: 25
            }
          ] 
 );
複製程式碼
  • 分享圖片不能太大。不超過5m。儘量小,jpg的格式
  • 卡牌的二維碼 使用客戶端的方法新增。不要放在整個大的背景圖片上,因為有些安卓手機分享到QQ會壓縮處理圖片。- 保證清晰度 大小是135*135。
  • 三個引數 沒有也要寫全。
    有些引數不需要用怎麼處理?
    第一個引數不需要:用透明的png圖片代替。(這種情況後面會說到);
    第二個引數圖片的陣列不需要:[]
    第三個引數文字不需要:[],ios填上text的引數

遺憾:

1.這種方法,填寫的動態文字只支援修改顏色和字號,不能使用特殊字型。
2.結果分類過多,設計同學工作量增大。
3.使用同一元件,有動態資訊,不能支援端外長按儲存功能。

-卡牌+動態資訊長按儲存圖片注意點~

解決

html2canvas. 官網連結
思路

  • 將寫好的頁面,包含特殊字型和動態資訊的dom生成一張圖片。將這個圖片作為Local.shareStyleImage方法裡面的圖片。解決端內的特殊字型和設計同學工作量問題
  • 將生成的圖片替代原來的dom展示,解決端外可以長按儲存的功能。並且能夠保證儲存的圖片有動態資訊。

程式碼

  1. 安裝html2canvas,版本 "version": "1.0.0-alpha.12",引入。[低版本圖片生成後會模糊]
  2. 基於html2canvas.js可將一個元素渲染為canvas,下列html2canvas方法會返回一個包含有canvas元素的promise.
html2canvas(document.querySelector('#capture')).then(canvas=>{
    let context = canvas.getContext('2d');
    context.mozImageSmoothingEnabled = false;
    context.webkitImageSmoothingEnabled = false;
    context.msImageSmoothingEnabled = false;
    context.imageSmoothingEnabled = false;
    this.canvasPic = canvas.toDataURL(); // 得到base64圖片
});
複製程式碼

-卡牌+動態資訊長按儲存圖片注意點~
注 :現在這個圖片就是一張完整的圖片。二維碼不要生成。如果要把2維碼放在頁面生成的話 2維碼大小寫成184184 / 150150 [需要和設計商量]

-卡牌+動態資訊長按儲存圖片注意點~
3. 呼叫客戶端Local.shareStyleImage方法分享。
發現遇到問題:
a.base64圖片太大 客戶端不能分享。->轉化圖片格式
b.把生成的圖片當做背景圖片作為第一個引數放入會有尺寸問題。->將它作為第二個引數填入,可以定義寬高
c.預設的背景圖片大小就是你分享卡牌的大小。一定要傳同樣尺寸的背景圖片
**d.如果卡牌高度超過了1334,那麼會將圖片等比縮小,造成卡牌有黑邊的情況。【和設計商量】 介面返給我們的圖片大小
-卡牌+動態資訊長按儲存圖片注意點~

    html2canvas(document.querySelector('#capture'), {}).then(canvas => {
        let context = canvas.getContext('2d');
        context.mozImageSmoothingEnabled = false;
        context.webkitImageSmoothingEnabled = false;
        context.msImageSmoothingEnabled = false;
        context.imageSmoothingEnabled = false;
        this.canvasPic = canvas.toDataURL();
        // 將base64轉化成png/jpg圖片的介面。原來的介面不支援png的,先介面已經完善。
        const imageData = encodeURIComponent(canvas.toDataURL().split(',')[1])
        const request = new XMLHttpRequest()
        request.open('POST', 'https://ptwapmusic3.reader.qq.com/activity/common/uploadPic');
        request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
        request.send(`imageData=${imageData}&actid=10171`)
        request.onload = _ => {
        const data = JSON.parse(request.response)z
        let imgObj = new Image(); // 建立圖片物件
        imgObj.src = data.url;
        imgObj.addEventListener('load', function () {
            console.log('fenxtu')
            }, false);
            this.canvasPicPng = data.url;
        }
 );
 
    Local.shareStyleImage(
          this.bgURL, // !!!不可以不傳 我用了一個透明的png的圖片。這個圖片的寬高就是你卡牌展示的寬高
          [
            {
              url: this.canvasPicPng, // 生成的圖片
              location: { x: 0, y: 0 },
              width: 700,
              height: 1032
            },
            {
              url: this.qrURL, //二維碼 
              location: { x: 450, y: 770 },
              width: 135,
              height: 135
            }
          ],
          [
            {
              text: `長按掃碼,做套題壓壓驚`,
              location: {
                x: 390,
                y: Y
              },
              color: "ffffff",
              fontSize: 25
            }
          ]
        );
複製程式碼
  1. 動態圖片渲染生成base64給後臺後臺返回不全。
    a、新增useCORS:true屬性;
    b、給要生成canvas的DOM中包含的每一個-卡牌+動態資訊長按儲存圖片注意點~標籤新增crossorigin="anonymous"屬性;
    c、確保你的圖片CDN伺服器支援CORS訪問,也就是會返回Access-Control-Allow-Origin等響應頭;
 html2canvas(document.querySelector('#capture'), {useCORS:true}).then(canvas => {}
複製程式碼
  1. 端外的長按儲存。
    等html2canvas生成後,將原來的dom元素隱藏,並將圖片新增到頁面中。這種就可以長按儲存圖片了。
  2. 卡牌上傳的圖片不能寫圓角。

-卡牌+動態資訊長按儲存圖片注意點~
解決:傳兩個圖片 一個頭像 一個容器,將透明的容器蓋在頭像上。

  1. 後期優化問題。
    因為圖片生成然後傳給後臺再到後臺返回給我們 需要一定的時間。如果在圖片還沒有返回來的時候 ,點選生成圖片的按鈕就會有問題。所以優化是在進入到結果頁的時候,預設的結果頁在後臺圖片還沒有拿到的時候,先將圖片透明,加一個使用者提示,圖片生成中。等圖片完全返回後,再將頁面的透明度去掉。這樣就能保證使用者點選生成圖片按鈕的時候 完全沒有問題。

  2. 沒有動態資料,不需要用html2canvas生成圖片。需要注意的問題。

-卡牌+動態資訊長按儲存圖片注意點~
這個背景圖的顏色有點過渡。在長屏手機上有適配有問題。 -> 透明的png圖片
-卡牌+動態資訊長按儲存圖片注意點~
使用透明的png圖片,端外儲存問題。 -> 展示用png 儲存用jpg.

相關文章