如何在不使用dom函数的情况下将uint8clampedarray转换为图像?

ig9co6j1  于 2021-09-23  发布在  Java
关注(0)|答案(1)|浏览(1196)

tl/dr:如何转换 Uint8ClampedArray 使用rgba值而不使用 DOM ( canvas 元素)或 OffscreenCanvas ?
我正在寻找一种方法来转换 Uint8ClampedArray 对象(它保存rgba值)设置为有效的 Blob 物体或物体 Blob url使用 URL.createObjectURL 对于由 blurhashfast-blurhash 包,限制为不能使用 DOM ( canvas 等)或 OffscreenCanvas .
这个 blurhash 库将“blurhash”转换为 Uint8ClampedArray 对象,保存rgba值,然后可用于渲染占位符图像;通常通过使用 canvas 元素。
在我的例子中,我想从 Uint8ClampedArray 未使用的对象 DOM -相关职能或 OffscreenCanvas .
有没有办法转换给定的 Uint8ClampedArray 使用将数据转换为可视图像 Blob A. Blob url或任何其他浏览器本机功能,而不使用 canvas ?
谢谢!

velaa5lx

velaa5lx1#

最好的方法是直接从imagebitmap转换为blob,但目前还没有(尽管bitmaprenderer画布与此非常接近)。
但是你可以自己编写一个png(或任何其他格式)编码器,或者使用互联网上已有的编码器(这里我将使用它)https://github.com/wheany/js-png-encoder 因为出于某些原因,它已经出现在我的浏览器历史记录中)。

  1. // We use a 32bit Array because it's faster to set pixels on it
  2. const data = new Uint32Array(300*150);
  3. // make some noise
  4. for(let i = 0; i<data.length; i++) {
  5. data[i] = Math.random() * 0xFFFFFF + 0xFF000000;
  6. }
  7. const uint8 = new Uint8ClampedArray(data.buffer);
  8. const as_str = [...uint8].map(byte => String.fromCharCode(byte)).join("");
  9. const png_str = generatePng(300, 150, as_str);
  10. const png_arr = new Uint8Array(png_str.length);
  11. for (let i = 0; i < png_str.length; i++) {
  12. png_arr[i] = png_str.charCodeAt(i);
  13. }
  14. const blob = new Blob([png_arr], {type: "image/png"});
  15. const img = new Image();
  16. img.src = URL.createObjectURL(blob);
  17. document.body.append(img)
  1. <script src="https://cdn.jsdelivr.net/gh/wheany/js-png-encoder@master/generatepng.js"></script>

然而,这可能不是一个好主意。就在这个片段中,我们在内存中复制了5次图像数据(2倍于原始像素数据,3倍于png),与本机libpng相比,我们用于进行所有转换的所有路径都非常慢。我不知道为什么您认为不能使用画布,但请注意,即使是node也有一个2d画布实现。

展开查看全部

相关问题