将UInt8array在Node.js中另存为png

问题描述 投票:0回答:1

我有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?

node.js
1个回答
0
投票

如@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');

也不需要宽度和高度,因为它是在缓冲区中编码的。

© www.soinside.com 2019 - 2024. All rights reserved.