Canvas.toDataURL 用不了咋办?
base64
输出),但是在某个环境下,Canvas.toDataURL
这个接口返回的数据是错误的。Canvas.toDataURL
,生成 base64
字符串。readPixels()
能读到位图的像素信息。输入: data: Uint8Array
位图信息 和 图片宽高。输出:带有图片信息的 base64
字符串。(可将该字符串放浏览器中的地址栏,会返回一张图片)
像素数据 -> 转 JPG
数据 -> 转base64
JPG
格式?按照厂里的方法,应该去了解其文件格式如何生成,需要什么头文件信息,关于JPEG
相关内容可参考wiki :github
中找到了前人留下的轮子。JavaScript
的代码,白玉无冰这里操作的是直接拷贝出来,放到一个 TypeScript
代码中,导出 encodeJPG
方法。jpeg-js
中的实例代码,组织一下,很快就生成了 JPEG
的数据。JPEG
的数据中 Uint8Array
转 base64
。// 这样我们就能从 RenderTexture 中获取到数据了
let data = texture.readPixels();
let width = texture.width;
let height = texture.height;
// 接下来翻转y的数据
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];
}
}
// 准备生成 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
以上为白玉无冰使用 Cocos Creator 2.4
实现 "截图生成 base64"
的过程分享,点击【阅读原文】发现更多白玉无冰实用教程。
往期精彩
评论