<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Canvas.toDataURL 用不了咋辦?

          共 3083字,需瀏覽 7分鐘

           ·

          2021-08-12 20:09

          事由是這樣的,接到一個(gè)截圖需求(以 base64 輸出),但是在某個(gè)環(huán)境下,Canvas.toDataURL 這個(gè)接口返回的數(shù)據(jù)是錯(cuò)誤的。
          為此,寫(xiě)一篇文章記錄一下,如何繞過(guò) Canvas.toDataURL ,生成 base64 字符串。
          以下為 Cocos官網(wǎng)文檔中給出的截圖事例代碼。
          https://docs.cocos.com/creator/manual/zh/render/camera.html#%E6%88%AA%E5%9B%BE
          官網(wǎng)中的截圖代碼
          幸運(yùn)的是 readPixels() 能讀到位圖的像素信息。
          程序就是處理輸入和輸出的過(guò)程,為此,明確我們的輸入輸出。
          • 輸入:data: Uint8Array 位圖信息 和 圖片寬高。
          • 輸出:帶有圖片信息的base64字符串。(可將該字符串放瀏覽器中的地址欄,會(huì)返回一張圖片)
          經(jīng)思考??一番,決定采用以下幾步實(shí)現(xiàn):
          • 像素?cái)?shù)據(jù) -> 轉(zhuǎn) JPG 數(shù)據(jù) -> 轉(zhuǎn) base64
          如何轉(zhuǎn) JPG 格式?按照廠里的方法,應(yīng)該去了解其文件格式如何生成,需要什么頭文件信息,關(guān)于JPEG相關(guān)內(nèi)容可參考wiki :
          https://en.wikipedia.org/wiki/JPEG
          但??,在思考前,可以考慮是否有前任??的輪子。畢竟時(shí)間也是一種成本。
          很快,很有型地在大型交友網(wǎng)站 github 中找到了前人留下的輪子。
          https://github.com/jpeg-js/jpeg-js/blob/master/lib/encoder.js
          這是 JavaScript 的代碼,白玉無(wú)冰這里操作的是直接拷貝出來(lái),放到一個(gè) TypeScript 代碼中,導(dǎo)出 encodeJPG 方法。
          搬運(yùn)與改造 jpeg-js
          再參考 jpeg-js 中的實(shí)例代碼,組織一下,很快就生成了 JPEG 的數(shù)據(jù)。
          像素?cái)?shù)據(jù) 轉(zhuǎn) JPEG 數(shù)據(jù)
          再把JPEG 的數(shù)據(jù)中 Uint8Array 轉(zhuǎn) base64。
          Uint8Array 轉(zhuǎn) base64
          但發(fā)現(xiàn)截圖反了。
          截圖反了
          最后,再對(duì)原來(lái)的數(shù)據(jù)翻轉(zhuǎn)一下,完整的核心代碼如下:
          // 這樣我們就能從 RenderTexture 中獲取到數(shù)據(jù)了
          let data = texture.readPixels();
          let width = texture.width;
          let height = texture.height;
          // 接下來(lái)翻轉(zhuǎn)y的數(shù)據(jù)
          const flipYData = new Uint8Array(width * height * 4);
          let rowBytes = width * 4;
          for (let row = 0; row < height; row++) {
              let startRow = height - 1 - row;
              let start = startRow * width * 4;
              for (let i = 0; i < rowBytes; i++) {
                  flipYData[row * width * 4 + i] = data[start + i];
              }
          }
          // 準(zhǔn)備生成 jpegImageData
          const rawImageData = {
              data: flipYData,
              width: width,
              height: height,
          };
          const jpegImageData = encodeJPG(rawImageData, 50);
          // jpeg -> base64
          function uint8ToString(buf{
              var i, length, out = '';
              for (i = 0, length = buf.length; i < length; i += 1) {
                  out += String.fromCharCode(buf[i]);
              }
              return out;
          }
          const base64 = btoa(uint8ToString(jpegImageData.data));
          cc.warn('base64'"data:image/jpg;base64," + base64);

          完整代碼工程:

          https://github.com/baiyuwubing/cocos-creator-examples/tree/master/2.4.x/assets/demo06

          以上為白玉無(wú)冰使用 Cocos Creator 2.4 實(shí)現(xiàn) "截圖生成 base64" 的過(guò)程分享,點(diǎn)擊【閱讀原文】發(fā)現(xiàn)更多白玉無(wú)冰實(shí)用教程。

          往期精彩

          瀏覽 30
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  婷婷色综合网 | 欧美大黄网站 | 欧美在线麻豆 | 殴美成人性爱大片免费看 | 欧美操逼-百度日本亚洲 |