gpt4 book ai didi

javascript - 如何将 BGRA 数组放入 Canvas 而不重新排序

转载 作者:行者123 更新时间:2023-12-02 16:11:44 25 4
gpt4 key购买 nike

我有一个 BGRA 数组,需要将其绘制到 Canvas 上。

目前我正在这样做:

var aVal = returnedFromChromeWorker;
var can = doc.createElementNS(NS_HTML, 'canvas');
can.width = aVal.width;
can.height = aVal.height;
var ctx = can.getContext('2d');

ctx.putImageData(aVal, 0, 0);

doc.documentElement.appendChild(can);

有什么方法可以将 BGRA 数组放到 Canvas 上吗?我正在探索:https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/imgIEncoder

我无法重新排序数组,因为我的目标是截取屏幕截图,对于大屏幕,即使只有 1280x1024,也需要 2.3 秒才能完成所有操作并重新排序。

我尝试在 ctypes 方面重新排序,但这给了我一些奇怪的问题:0,使整个图像不可见>_< lol BITMAPV5HEADER getting RGBA keep A at 255

最佳答案

How to put BGRA array into canvas without re-ordering

没有。

重新组织字节顺序是必要的,因为 Canvas 只能保存 RGBA 格式的数据(little-endian,即缓冲区中的 ABGR)。这是执行此操作的一种方法:

您可以为您的工作人员添加额外的步骤来处理重新排序。为原始字节缓冲区 (ArrayBuffer) 创建一个 DataView,然后迭代每个 Uint32 值。

下面的 Uint32 被读取为小端。这是因为在这种情况下,格式更容易交换,因为我们只需右移 BGR 并将 A 放回前面。如果您的原始缓冲区采用大端字节序,您当然需要将其读取为大端字节序并设置为小端字节序 (getUint32(pos, false)):

示例

var uint32 = new Uint32Array(1), pos = 0;  // create some dummy data
var view = new DataView(uint32.buffer); // create DataView for byte-buffer
var pos = 0; // byte-position (we'll skip 4 bytes each time)

// dummy data in BGRA format
uint32[0] = 0x7722ddff; // magenta-ish in BGRA format
document.write("BGRA: 0x" + (uint32[0]).toString(16) + "<br>");

// --- Iterate buffer, for each: ---
var v = view.getUint32(pos, true); // BGRA -> RGBA, read as little-endian
var n = (v >>> 8) | (v << 24); // rotate - move A from last to first position
view.setUint32(pos, n, true); // set back
pos += 4; // do this when inside the loop

// result
document.write("ABGR: 0x" + (uint32[0]>>>0).toString(16));

更新如果两端的字节顺序(endian-wise)相同,您可以跳过DataView并直接使用Uint32Array这也会加快速度:

var uint32 = new Uint32Array(1), pos = 0;  // create some dummy data

// inside loop:
var v = uint32[pos];
uint32[pos++] = (v >>> 8) | (v << 24); // pos index is now per uint32

关于javascript - 如何将 BGRA 数组放入 Canvas 而不重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30110973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com