【发布时间】:2018-04-16 20:07:47
【问题描述】:
我使用 Javascript 和 HTML5 从内置网络摄像头捕获帧,并打算以 BASE64 格式将它们异步发送到我的服务器。
问题是这些帧的总大小是巨大的!
我的想法是将这些 RGBA 图像从 4 个通道变为 1 个(因为我确实需要 8 位灰度帧)。
下面的 sn-p(以及我发现的所有其他)将它们转换为灰度,但再次使用 4 通道并使用画布方法 toDataURL() 将它们转换为 BASE64 格式。因此,总大小保持不变。
var imgData = ctx.getImageData(0, 0, 34, 26);
let grayscale = []; // desired one channel 8-bit array
for (var y = 0; y < imgData.height; y++) {
for (var x = 0; x < imgData.width; x++) {
var i = y * 4 * imgData.width + x * 4;
var weighted =
Math.floor( // round in order to use 8-bit integers
0.299 * imgData.data[i] +
0.587 * imgData.data[i + 1] +
0.114 * imgData.data[i+2]
);
imgData.data[i] = weighted;
imgData.data[i + 1] = weighted;
imgData.data[i + 2] = weighted;
grayscale.push(weighted);
}
}
cxt.putImageData(
imgData,
0,
0,
0,
0,
imgData.width,
imgData.height
);
b64 = cxt.canvas.toDataURL().split(",")[1];
我的问题如下:
如何使用最少的字节数仅发送所需的一个 8 位通道?
【问题讨论】:
-
您可以尝试使用
toDataURL('image/webp'),因为它可以使用调色板,因此应该从灰度中获得一些良好的压缩,默认为 PNG 和最有可能是 32 位。 webp 也将进行无损和有损压缩,因为没有无损我假设您将第二个参数设置为 1.. -
谢谢@Keith,webp 格式可以帮助压缩
标签: javascript html base64 compression grayscale