Heim  >  Artikel  >  Web-Frontend  >  Eingehende Analyse der in WeChat-Applet-Seiten implementierten Speicherung von Bildern (mit Code)

Eingehende Analyse der in WeChat-Applet-Seiten implementierten Speicherung von Bildern (mit Code)

奋力向前
奋力向前nach vorne
2021-08-18 09:42:535056Durchsuche

Im vorherigen Artikel „Eine kurze Analyse der Interaktion zwischen WeChat-Miniprogrammen und dem Web (Code-Sharing)“ werde ich Ihnen ein Verständnis für die Interaktion zwischen WeChat-Miniprogrammen und dem Web vermitteln. Der folgende Artikel vermittelt Ihnen ein Verständnis dafür, wie Sie Bilder auf der WeChat-Applet-Seite speichern. Ich hoffe, dass er Ihnen weiterhilft.

Eingehende Analyse der in WeChat-Applet-Seiten implementierten Speicherung von Bildern (mit Code)

Hintergrund

Speichern Sie das Bild in der Webansicht des Miniprogramms. Da das js-sdk von WeChat die Methode saveImageToPhotosAlbum nicht bereitstelltwebview里保存图片。因为微信的js-sdk没有提供saveImageToPhotosAlbum方法

更多web和小程序的交互,请看这里

解决思路

先加载微信js-sdk

<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

分三步

1、html端把图片转为base64,然后通过postmessage传递给小程序

let img = new Image();
img.src = "xxxx"; //这里是图片的src
img.crossOrigin = "anonymous"; //The opeartaion is insecure . 其它跨域的问题 自行代理解决
img.onload = function () {
  let canvas = document.createElement("canvas");
  canvas.width = img.width;
  canvas.height = img.height;
  let ctx = canvas.getContext("2d");
  ctx.drawImage(this, 0, 0);
  let imgBase64Data = canvas.toDataURL("image/jpeg", 1); //这里就拿到了base64
  wx.miniProgram.postMessage({
    data: {
      imgData: imgBase64Data, // 刚才拿到的base64 数据
    },
  });
};

2、小程序监听postmessage拿到图片base64数据。

// wxml
<
web - view src = "http://www.chuchur.com/save-image"
bindmessage = "getMessage" > < /web-view>

// js
Page({
    data: {
        imageData: null
    }
    getMessage(e) {
        this.setData({
            imageData: e.detail.data[0].imgData
        })
    }
})

3. 保存图片到相册(在小程序里)

因为拿到是base64图片数据,首先要把它存为图片文件。

wx.getFileSystemManager().writeFile({
  filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这里先把文件写到临时目录里.
  data: this.data.imageData.slice(22), // 注意这里
  encoding: "base64",
  success: (res) => {
    console.log("success");
  },
  fail: (error) => {
    console.log(error);
  },
});

getFileSystemManager的writeFile写入的base64是不包含图片的头字节的。所以要干掉data:image/jpeg;base64,等字符

有了文件路径就可以保存到相册了

wx.saveImageToPhotosAlbum({
  filePath: wx.env.USER_DATA_PATH + "/qrcode.png", //这是把临时文件 保存到 相册, 收工
  success: (res) => {
    wx.showToast({
      title: "保存成功!",
    });
  },
  fail: (error) => {
    console.log(error);
  },
});

没有接收到?不是实时触发?

文档发现虽然h5中的postMessage会马上提交信息,但是小程序并不会马上受理,在小程序webview上的监听函数,只会在特定时机触发并收到消息:也就是postMessage所有的消息都只能等得分享或webview的生命周期结束才会被触发。他是一个消息队列:

getMessage: function(e) {
    if (e.type === &#39;message&#39; && e.detail && e.detail.data && e.detail.data.length > 0) {
        e.detail.data.forEach(function(dataItem) {
            if (dataItem.type === &#39;qbreport&#39; && dataItem.key) {
                // todo: yourFn(dataItem.key)
            }
        })
    }

}

所以,我们在执行保存的时候可以立马触发它的返回事件。

function() {
    // 此处省略
    wx.miniProgram.postMessage({
        data: {
            xxx: &#39;aaa&#39;
        }
    })
    wx.miniProgram.navigateBack({
        delta: 1
    }) //注意这里.
}

完整的代码如下:

html

Weitere Interaktion zwischen web und Miniprogrammen finden Sie

hier

Um es zu lösen. Idee: Laden Sie zuerst WeChat js-sdk.


webchat webview save image
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script> <script> function saveImage() { let img = new Image() img.src = &#39;xxxx&#39; //这里是图片的src img.crossOrigin = &#39;anonymous&#39; //The opeartaion is insecure , 其他跨域问题自行代理解决. img.onload = function() { let canvas = document.createElement(&#39;canvas&#39;) canvas.width = img.width canvas.height = img.height let ctx = canvas.getContext(&#39;2d&#39;) ctx.drawImage(this, 0, 0) let imgBase64Data = canvas.toDataURL(&#39;image/jpeg&#39;, 1) //这里就拿到了base64 wx.miniProgram.postMessage({ data: { imgData: imgBase64Data // 刚才拿到的base64 数据 } }) wx.miniProgram.navigateBack({ delta: 1 }) //注意这里. } } </script>
/code>-Seite und übergeben Sie es dann über postmessage an das Applet. Das Applet hört auf postmessage und erhält das Bild base64Code> Daten. <strong></strong><pre class="brush:php;toolbar:false">// wxml &lt; web - view src = &quot;http://www.chuchur.com/save-image&quot; bindmessage = &quot;getMessage&quot; &gt; &lt; /web-view&gt; // js Page({ getMessage(e) { let img = e.detail.data[0].imgData wx.getFileSystemManager().writeFile({ filePath: wx.env.USER_DATA_PATH + &amp;#39;/qrcode.jpeg&amp;#39;, //这里先把文件写到临时目录里. data: img.slice(22), //注意这里 encoding: &amp;#39;base64&amp;#39;, success: res =&gt; { console.log(&amp;#39;success&amp;#39;) wx.saveImageToPhotosAlbum({ filePath: wx.env.USER_DATA_PATH + &amp;#39;/qrcode.jpeg&amp;#39;, //这是把临时文件 保存到 相册, 收工 success: res =&gt; { wx.showToast({ title: &amp;#39;保存成功!&amp;#39; }) }, fail: error =&gt; { console.log(error) } }) }, fail: error =&gt; { console.log(error) } }) } })</pre>

3. Speichern Sie das Bild im Album (im Miniprogramm)
Da Sie die Bilddaten base64 erhalten, müssen Sie diese zunächst als Bilddatei speichern.

  wx.showLoading({
      title: "正在下载图片... ",
      mask: !1
  })

  wx.downloadFile({
  url: &#39;填写一个远程的图片链接&#39;,
  success: function(t) {

      wx.showLoading({
          title: "正在保存图片",
          mask: !1
      })
      wx.saveImageToPhotosAlbum({
          filePath: t.tempFilePath,
          success: function() {
              wx.showModal({
                  title: "自定义提示信息",
                  content: "保存成功",
                  showCancel: !1
              });
          },
          fail: function(t) {
              wx.showModal({
                  title: "图片保存失败",
                  content: t.errMsg,
                  showCancel: !1
              });
          },
          complete: function(t) {
              wx.hideLoading();
          }
      });

  },
  fail: function(t) {
      wx.showModal({
          title: "图片下载失败",
          content: t.errMsg,
          showCancel: !1
      });
  },
  complete: function(t) {
      wx.hideLoading();
  }
  }))
🎜🎜Das von writeFile von getFileSystemManager geschriebene Base64 enthält nicht das Header-Byte des Bildes. Wir müssen also data:image/jpeg;base64 und andere Zeichen entfernen🎜🎜🎜Mit dem Dateipfad können Sie es im Album speichern🎜rrreee🎜Haben Sie es nicht erhalten? Nicht in Echtzeit ausgelöst? 🎜🎜Das Dokument stellte fest, dass postMessage in h5 die Informationen zwar sofort übermittelt, das Miniprogramm sie jedoch nicht sofort im Miniprogramm webviewakzeptiert > Die Abhörfunktion wird nur zu bestimmten Zeiten ausgelöst und empfängt Nachrichten: Das heißt, alle Nachrichten in postMessage können erst ausgelöst werden, nachdem der Lebenszyklus der Freigabe oder webview endet. . Es handelt sich um eine Nachrichtenwarteschlange: 🎜rrreee🎜🎜Also🎜, wir können ihr Rückgabeereignis sofort auslösen, wenn wir den Speichervorgang ausführen. 🎜rrreee🎜 Der vollständige Code lautet wie folgt: 🎜🎜 HTML Nebencode: 🎜rrreee🎜small Programm Nebencode: 🎜rrreee🎜oTher Related🎜🎜🎜Save Remote Pictures🎜🎜rrreee🎜Recompt: 🎜 SVG-Video-Tutorial🎜🎜🎜

Das obige ist der detaillierte Inhalt vonEingehende Analyse der in WeChat-Applet-Seiten implementierten Speicherung von Bildern (mit Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:chuchur.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen