WGShare.Client.Electron/src/utils/package/base64.ts

74 lines
2.2 KiB
TypeScript

import { ThumbImageBuffer } from 'agora-electron-sdk';
export default (input: any) => {
const keyStr =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let output = '';
let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
let i = 0;
while (i < input.length) {
chr1 = input[i++];
chr2 = i < input.length ? input[i++] : Number.NaN; // Not sure if the index
chr3 = i < input.length ? input[i++] : Number.NaN; // checks are needed here
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 +=
keyStr.charAt(enc1) +
keyStr.charAt(enc2) +
keyStr.charAt(enc3) +
keyStr.charAt(enc4);
}
return output;
};
export const thumbImageBufferToBase64 = (target?: ThumbImageBuffer) => {
if (!target) {
return '';
}
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
if (!ctx) return '';
const width = (canvas.width = target.width!);
const height = (canvas.height = target.height!);
const rowBytes = width * 4;
for (let row = 0; row < height; row++) {
const srow = row;
const imageData = ctx.createImageData(width, 1);
const start = srow * width * 4;
for (let i = 0; i < rowBytes; i += 4) {
imageData.data[i] = target.buffer![start + i + 2]!;
imageData.data[i + 1] = target.buffer![start + i + 1]!;
imageData.data[i + 2] = target.buffer![start + i]!;
imageData.data[i + 3] = target.buffer![start + i + 3]!;
}
// if (process.platform === 'win32') {
// for (let i = 0; i < rowBytes; i += 4) {
// imageData.data[i] = target.buffer![start + i + 2]!;
// imageData.data[i + 1] = target.buffer![start + i + 1]!;
// imageData.data[i + 2] = target.buffer![start + i]!;
// imageData.data[i + 3] = target.buffer![start + i + 3]!;
// }
// } else {
// for (let i = 0; i < rowBytes; ++i) {
// imageData.data[i] = target.buffer![start + i]!;
// }
// }
ctx.putImageData(imageData, 0, row);
}
return canvas.toDataURL('image/png');
};