首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageData到画布

ImageData到画布
EN

Stack Overflow用户
提问于 2020-05-02 12:00:04
回答 2查看 84关注 0票数 0

我正在尝试将图像数据放到画布c/ctx上,以下是我当前的代码:

代码语言:javascript
复制
console.log('Worker said: '+ e.data[1]);
var image = ctx.createImageData(20,300);
image.data = e.data[1];
ctx.putImageData(image,e.data[0],0);

是的,worker正在输出正确的信息(e.data1 =图像数据数组r,g,b,透明度,...,e.data =要导入的xpos )

我不明白为什么这不起作用?

以下是我的画布设置,以防万一

代码语言:javascript
复制
var c = document.getElementById("myCanvas")
var ctx = c.getContext('2d', { alpha: false });
c.width = 300;
c.height = 300;
EN

回答 2

Stack Overflow用户

发布于 2020-05-02 12:51:03

不能将数组赋值给.data属性,必须复制值,这应该是可行的

代码语言:javascript
复制
var image = ctx.createImageData(20,300);
var length = e.data[1].length;

for (var i = 0; i < length; i++) {
    image.data[i] = e.data[1][i];
}
ctx.putImageData(image,e.data[0],0);
票数 0
EN

Stack Overflow用户

发布于 2020-05-02 18:11:16

在现代浏览器中(IE除外),您可以使用接受Uint8ClampedArray作为输入的ImageData constructor

因此,假设您的Worker发送了一个Uint8Array,您所要做的就是首先在与发送的ArrayBuffer相同的ArrayBuffer上创建一个新的TypedArray视图,然后使用该视图初始化ImageData

代码语言:javascript
复制
const worker = new Worker( generateWorkerURL() );
worker.onmessage = (evt) => {
  // first a new view (same ArrayBuffer)
  const clampedView = new Uint8ClampedArray( evt.data.buffer );
  const imageData = new ImageData( clampedView, 500, 300 );
  const ctx = document.getElementById( 'canvas' ).getContext( '2d' );
  ctx.putImageData( imageData, 0, 0 );
};



// helper to integrate Worker in a Snippet
function generateWorkerURL() {
  const content = document.querySelector('[type="worker-script"]').textContent;
  const blob = new Blob( [ content ], { type: "text/javascript" }  );
  return URL.createObjectURL( blob );
}
代码语言:javascript
复制
<script type="worker-script">
  // fake worker code, generates noise
  const data = Uint8Array.from(
    { length: 500 * 300 * 4 },
    () => Math.random() * 0xFF
  );
  // We 'transfer' the TypedArray's buffer so that it's not copied
  // by passing it in an Array as the second argument of postMessage
  postMessage( data, [ data.buffer ] );
</script>
<canvas id="canvas" width="500" height="300"></canvas>

现在,您甚至可以直接从工作线程中的ImageData开始工作,并在完成后将其传输到主线程:

代码语言:javascript
复制
const worker = new Worker( generateWorkerURL() );
worker.onmessage = (evt) => {
  const ctx = document.getElementById( 'canvas' ).getContext( '2d' );
  // put directly the imageData sent by the Worker
  ctx.putImageData( evt.data, 0, 0 );
};



// helper to integrate Worker in a Snippet
function generateWorkerURL() {
  const content = document.querySelector('[type="worker-script"]').textContent;
  const blob = new Blob( [ content ], { type: "text/javascript" }  );
  return URL.createObjectURL( blob );
}
代码语言:javascript
复制
<script type="worker-script">
  // fake worker code, generates noise
  const imageData = new ImageData( 500, 300 );
  for( let i=0; i<imageData.data.length; i++ ) {
    imageData.data[ i ] = Math.random() * 0xFF;
  }
  // we transfer the ImageData's buffer
  postMessage( imageData, [ imageData.data.buffer ] );
</script>
<canvas id="canvas" width="500" height="300"></canvas>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61554291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档