- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!