gpt4 book ai didi

javascript - ImageBitmap 和 ImageData 的区别

转载 作者:行者123 更新时间:2023-12-03 23:11:59 26 4
gpt4 key购买 nike

ImageBitmap 和有什么区别和 ImageData在 JavaScript 中?你什么时候想要一个或另一个?

最佳答案

ImageBitmap 持有对位图数据的引用,可以将其传递到 GPU 并直接存储在 GPU 中。

ImageData 持有对 canvas pixel ArrayBuffer 的引用。 ,它本身将原始像素值表示为未预乘的 RGBA 颜色 channel 值的数组,仅由 CPU 使用。

前者可以直接由GPU绘制,无需其他操作。后者需要被读取(通常使用 alpha 预乘法),然后移动到 GPU 才能绘制。

它们不会花费相同的时间来复制到 Canvas 位图(a.k.a “painted”)。

var target = document.getElementById('target');
var ctx = target.getContext("2d");

var imageData = ctx.createImageData(300,150);
var imageBitmap = null;

// fill our ImageData with noise
const data = new Uint32Array(imageData.data.buffer);
for(let i=0; i<data.length; i++) {
data[i] = Math.random()*0xFFFFFF + 0xFF000000;
}
// initial draw
ctx.putImageData(imageData, 0,0);
// we create our ImageBitmap from the current state
// (=> ~ same bitmap as 'imageData')
createImageBitmap(target).then((bmp)=>{
imageBitmap = bmp;
btn.disabled = false;
});


// Benchmark.js playground borrowed from
// https://jsfiddle.net/533hc71h/

var test1_name = 'ImageData';
function test1()
{
ctx.putImageData(imageData, 0, 0);
}
var test2_name = 'ImageBitmap';
function test2()
{
ctx.drawImage(imageBitmap, 0, 0);
}
function teardown()
{
ctx.clearRect(0,0,target.width,target.height);
}

var cycleResults = document.getElementById('cycleResults');
var result = document.getElementById('result');
var btn = document.getElementById('btn');

// BENCHMARK ====================
btn.onclick = function runTests(){

btn.setAttribute('disable', true);
cycleResults.innerHTML = '';
result.textContent = 'Tests running...';

var suite = new Benchmark.Suite;

// add tests
suite
.add(test1_name || 'test1', test1)
.add(test2_name || 'test2', test2)
// add listeners
.on('cycle', function(event) {
var result = document.createElement('li');
result.textContent = String(event.target);

document.getElementById('cycleResults')
.appendChild(result);
})
.on('complete', function() {
result.textContent = 'Fastest is ' + this.filter('fastest').pluck('name');
btn.setAttribute('disable', false);
teardown();
})
// run async
.run({ 'async': true });
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.min.js"></script>

<ul id='cycleResults'>

</ul>
<div id="result">

</div>
<br>
<button id="btn" disabled>
Run Tests
</button><br>

<canvas id="target"></canvas>


运行上面的代码片段,我得到大约 5K OPS(每秒操作数)来绘制 ImageData,200K+ 用于 Chrome 上的 ImageBitmap(44K 与 FF 中的 125K)。

但是,您不能修改 ImageBitmap,也不能以任何有意义的方式读取其内容。

所以,
  • 如果需要绘制位图,请使用 ImageBitmap。
  • 如果您需要读取/操作图像的数据,请使用 ImageData。

  • 请记住,由于 OffscreenCanvas API,现在我们还可以直接在 Worker 中保存 Canvas 上下文,这也可能满足您的需求。

    关于javascript - ImageBitmap 和 ImageData 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60031536/

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