Compression 如何压缩用于存储和传输的Darray/ArrayBuffers类型

Compression 如何压缩用于存储和传输的Darray/ArrayBuffers类型,compression,storage,typed-arrays,transmission,Compression,Storage,Typed Arrays,Transmission,我们开始使用图像通过canvas的ImageData对象方便地存储TypeDarray。但由于。。将我们的数据限制为24位。我们正在蹒跚前行,但希望有一个32位的解决方案 我们希望转换为使用任何类型的Darray或其ArrayBuffer。但这些都是由于缺乏压缩 有什么有趣的压缩方法吗?找出如何制作非预乘PNG?其他?图像数据将为您提供32位(RGB+alpha通道)。预乘法部分指的是alpha通道和由于使用整数值而产生的舍入误差(除非您希望制作一个自定义的基于浮点的位图,否则无法解决此问题,这

我们开始使用图像通过canvas的ImageData对象方便地存储TypeDarray。但由于。。将我们的数据限制为24位。我们正在蹒跚前行,但希望有一个32位的解决方案

我们希望转换为使用任何类型的Darray或其ArrayBuffer。但这些都是由于缺乏压缩

有什么有趣的压缩方法吗?找出如何制作非预乘PNG?其他?

图像数据将为您提供32位(RGB+alpha通道)。预乘法部分指的是alpha通道和由于使用整数值而产生的舍入误差(除非您希望制作一个自定义的基于浮点的位图,否则无法解决此问题,这是可能的,但速度较慢(er))。您仍将获得32位数据,但在某些地方会出现舍入错误

对于数据,您可以使用用于JavaScript的zlib端口。它速度快,与原始实现结果100%兼容,并提供良好的压缩

它返回一个
Uint8Array
,可以将其转换为Blob或
ArrayBuffer
,以便使用f.ex进行存储<代码>索引数据库或通过网络传输

示例用法 压缩数据:

// assuming CORS requirements are fulfilled:
var data = ctx.getImageData(x, y, width, height).data;
var comp = pako.deflate(data);
try {
  var data = pako.inflate(comp);
  var idata = new ImageData(width, height); // or via getImageData()
  idata.data.set(data);
  ctx.putImageData(idata, x, y);
}
catch (err) {
  console.log(err);
}
解压缩数据:

// assuming CORS requirements are fulfilled:
var data = ctx.getImageData(x, y, width, height).data;
var comp = pako.deflate(data);
try {
  var data = pako.inflate(comp);
  var idata = new ImageData(width, height); // or via getImageData()
  idata.data.set(data);
  ctx.putImageData(idata, x, y);
}
catch (err) {
  console.log(err);
}

里面有什么类型的数据?任何类型的类型化数组,256x256“tiles”。256 X 256磁贴的原始数据大小为每8位单元/像素深度64 KB。因此,对于8、16、32和64位深度,大小分别为64K、128K、256K和512K。这些数据可以是对我们的项目有用的任何类型:海拔、经过的时间、人口。。。i、 所有类型化的数据类型。实际上是预处理的问题,例如,高程可能通过从中减去顶部和左侧样本的平均值来很好地解相关。您还可以研究类似bzip2的压缩是如何对数据执行的。。这是我发现的。1) 对类型化数组进行压缩并转换为base64,然后再次进行压缩,可以使类型化数组接近图像存储。LZMA速度较慢,但更具压缩性。2) 使用漂亮的webgl特技,使用纹理、w/o颜色分析或alpha预乘以及readpixels。。产生图像作为数据的非失真转换。我应该在上面贴一个要点。