首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克隆ImageData?

如何克隆ImageData?
EN

Stack Overflow用户
提问于 2012-06-14 13:39:48
回答 3查看 5.9K关注 0票数 10

这是有效的,但我觉得这段代码太长了。我在寻找更好的点子。

代码语言:javascript
复制
var clone = function(imageData) {
  var canvas, context;
  canvas = document.createElement('canvas');
  canvas.width = imageData.width;
  canvas.height = imageData.height;
  context = canvas.getContext('2d');
  context.putImageData(imageData, 0, 0);
  return context.getImageData(0, 0, imageData.width, imageData.height);
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-13 23:20:50

使用TypedArray.prototype.set(),您可以直接复制数据。

代码语言:javascript
复制
var imageDataCopy = new Uint8ClampedArray(originalImageData.data);
imageDataCopy.data.set(originalImageData.data);

这会将imageDataCopy的内容设置为与originalImageData相同。

票数 11
EN

Stack Overflow用户

发布于 2018-01-03 21:31:07

ImageData构造函数接受图像数据数组。

代码语言:javascript
复制
const imageDataCopy = new ImageData(
  new Uint8ClampedArray(imageData.data),
  imageData.width,
  imageData.height
)
票数 12
EN

Stack Overflow用户

发布于 2021-09-11 00:51:52

大多数情况下,只需将imageData赋给一个新变量就足够了,就像这样:

代码语言:javascript
复制
myImgData=ctx.getImageData(0,0,c.width,c.height); //get image data somewhere
imgDataCopy = myImgData;   // clone myImgData

...now imgDataCopy包含myImgData的单独副本。‍♂️

演示

下面的代码片段在ImageData数组中创建了4个“帧”,然后循环遍历它们。

代码语言:javascript
复制
const c = document.getElementById('canvas'),
      ctx = c.getContext("2d");
var wh=70, iDatas=[], i=0,
    lines=[[10,10,wh-10,wh-10], [wh/2,5,wh/2,wh-5],  // ⤡,↕
           [wh-10,10,10,wh-10], [5,wh/2,wh-5,wh/2]]; // ⤢,↔
c.width=wh;
c.height=wh;

ctx.strokeStyle='blue'; //setup to draw
ctx.lineWidth=9;
ctx.lineWidth='round';

for(var [x1,y1,x2,y2] of lines){ 
  ctx.beginPath();
  ctx.moveTo(x1,y1); //draw something
  ctx.lineTo(x2,y2);
  ctx.stroke();
  var d=ctx.getImageData(0,0,c.width,c.height); //get imgdata
  iDatas.push( d ); //save imgdata to array
  ctx.clearRect(0, 0, c.width, c.height); //clear canvas
}

ctx.strokeStyle='green'; //❌has no effect: 
  //  ↑ shows that color data comes from the source (can't be changed)
ctx.lineWidth='round'; //❌has no effect: 
  //  ↑ shows that non-color styling does NOT come from source (CAN'T be changed)

//now you can refer to the image data as iData[i] where i= 0 to 3
drawFrame();
function drawFrame(){
  ctx.putImageData( iDatas[i],0,0); //draw imgData from array
  i=(i==3?0:i+1); //set next iteration #
  setTimeout(function(){ drawFrame() }, 100); //schedule next frame
}
代码语言:javascript
复制
canvas{ border:2px dotted salmon; }
代码语言:javascript
复制
<canvas id='canvas'></canvas>

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

https://stackoverflow.com/questions/11027254

复制
相关文章

相似问题

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