我有UInt8array,png图片的宽度,高度。我试图这样保存它
const screenshot = new TextDecoder('utf-8').decode(await frame.exportAsync()) // figma.com/plugin-docs/api/properties/nodes-exportasync
// passing screenshot as string over network
const uint8array = new TextEncoder('utf-8').encode(screenshot);
const data = Buffer.from(uint8array);
fs.writeFileSync(`${fileName}.png`, data, 'binary');
但是此代码显然不考虑宽度和高度。
如何将其正确保存为Node.js中的png?
如@Lux所述,使用UTF8字符串传输二进制数据是不安全的,所以我使用了转换为base64的方法
此作品
var base64 = btoa(new Uint8Array(await frame.exportAsync()).reduce((data, byte) => data + String.fromCharCode(byte), ''),
);
// passing screenshot as string over network
function urlBase64ToUint8Array(base64String: string) {
var padding = '='.repeat((4 - (base64String.length % 4)) % 4);
var base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
var rawData = atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
const uint8array = urlBase64ToUint8Array(screenshot);
const data = Buffer.from(uint8array);
fs.writeFileSync(`${fileName}.png`, data, 'binary');
也不需要宽度和高度,因为它是在缓冲区中编码的。