在webgl模式下,base64图片加载问题

项目需求要在游戏中显示玩家们的facebook头像,参考过JOKER大大的贴子,但是还是没有成功。
代码如下:
var base64 = cc.js.formatStr(“data:image/jpg;base64,%s”, str);//str是由自己的服务器获取fb服务器的jpg头像的base64字符串
var img = new Image();
img.src = base64;
img.onload = function () {
var texture = new cc.Texture2D();
//texture.generateMipmaps = false;//这个参数在1.6.2版本中已经不存在了
texture.initWithElement(img);
texture.handleLoadedTexture();
var newframe = new cc.SpriteFrame(texture);
sprite.spriteFrame = newframe;
};

报错信息如下:
WebGL: INVALID_VALUE: texImage2D: bad image data
212.game.once._p.handleLoadedTexture @ CCTexture2D.js:817
img.onload @ test.js:45

[.Offscreen-For-WebGL-13983550]RENDER WARNING: texture bound to texture unit 0 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

Texture的大小是能获取到的,但是无法使用。

请各位大大帮忙看看,多谢了。
附一个头像参考链接:http://lorempixel.com/256/256/cats/

  • Creator 版本号:1.6.2
  • 目标平台:Web
1赞

大兄弟,解决了吗,我也有这个问题

已经解决了,之前的问题出在base64的encode上,我用的是window.btoa来对二进制数据进行base64编码,编码结果是不能正常转换为Texture的。

附上我的代码:
★base64.js:

let keyStr = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=”;

const encode = (input) => {
var output = “”;
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;
//input = Base64._utf8_encode(input); //comment out to encode binary file(like image)

while (i < input.length) {

    chr1 = input[i++];
    chr2 = input[i++];
    chr3 = input[i++];

    enc1 = chr1 >> 2;
    enc2 = (chr1 & 3) << 4 | chr2 >> 4;
    enc3 = (chr2 & 15) << 2 | chr3 >> 6;
    enc4 = chr3 & 63;

    if (isNaN(chr2)) {
        enc3 = enc4 = 64;
    } else if (isNaN(chr3)) {
        enc4 = 64;
    }
    output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
}
return output;

}

export default {
encode
};

★http.js:
var URL = “http://127.0.0.1:19000”;

var HTTP = cc.Class({
extends: cc.Component,

statics: {
    sessionId: 0,
    userId: 0,
    master_url: URL,
    url: URL,
    sendRequest: function (path, data, handler, extraUrl, notJson = false) {
        var xhr = cc.loader.getXMLHttpRequest();
        xhr.timeout = 20000;
        var str = "?";
        for (var k in data) {
            if (str != "?") {
                str += "&";
            }
            str += k + "=" + data[k];
        }
        if (extraUrl == null) {
            extraUrl = HTTP.url;
        }
        var requestURL = extraUrl + path + encodeURI(str);
        // console.log("RequestURL:" + requestURL);
        xhr.open("GET", requestURL, true);
        if (cc.sys.isNative) {
            xhr.setRequestHeader("Accept-Encoding", "gzip,deflate", "text/html;charset=UTF-8");
        }

        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)) {
                // console.log("http res(" + xhr.responseText.length + "):" + xhr.responseText);
                try {
                    var ret = notJson ? xhr.responseText : JSON.parse(xhr.responseText);
                    if (handler !== null) {
                        handler(ret);
                    }                        /* code */
                } catch (e) {
                    console.log("err:" + e);
                    //handler(null);
                }
                finally {
                }
            }
        };
        xhr.send();
        return xhr;
    },
},

});

★getHeadTexture.js
import base64 from “./base64”;
let http = require("./http");

/**

  • 获取头像
  • @param {*} url
  • @param {*} callback
    */
    const getHeadTexture = (url, callback) => {
    http.sendRequest("/download_head", { headurl: window.btoa(url) }, function (ret) {
    var blob = new Uint8Array(ret.data);
    var img = new Image();
    var base = “data:image/jpg;base64,” + base64.encode(blob);
    img.src = base;
    //var texture=spriteFrame.getTexture();
    img.onload = function () {
    var texture = new cc.Texture2D();
    texture.initWithElement(img);
    texture.handleLoadedTexture();
    if (callback)
    callback(texture);
    };
    });
    }

export default {
getHeadTexture
};

最后,getHeadTexture中的callback的texture参数即为最后得到的贴图数据,可以直接用在SpriteFrame上。

2赞

你好,想问一下你的那个ret.data是什么样子的数据结构啊,是一个图片地址的数组吗