已经解决了,之前的问题出在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上。