2012-01-15 82 views
0

我想使用画布来掩饰图像使用几个单独的面具(我设法把他们每个人在一个单独的ImageData对象)。无法对ImageData对象执行多个操作?

蒙版图像是黑色和白色,没有alpha通道。我需要将遮罩层叠在一起,所以我需要(un?)预乘alpha,或将红色通道放在alpha通道中。

当我尝试仅将一个蒙版应用于原始图像时,它的效果非常好,但当我尝试使用多个蒙版时会中断。我做这样的:

base.iMask = function(cx, imgData, maskLeft, maskRight, maskTop, maskBottom) { 
     var index = 0; 
     var newdata = cx.createImageData(imgData); 

     for (var i=0; i<maskLeft.width; i++) { 
      for (var j=0; j<maskLeft.height; j++) { 
       index = (i*4)*maskLeft.width+(j*4); 

       newdata.data[index+3] = maskLeft.data[index]; 
      } 
     } 

     // The same cycle is repeated for each mask (4 total) 

     return newdata; 

的问题是,只有最后的面具被应用。我试图在每个循环之前使用putImageData,然后使用getImageData,但它不起作用!

对ImageData()对象执行(un)预乘的函数可以解决我的问题。有任何想法吗?

回答

0

修正了它,但无论如何我会为可能感兴趣的人回答它。

问题是我覆盖了像素数据。这是新的代码:

var index = 0; 
     for (var i=0; i<maskData.width; i++) { 
      for (var j=0; j<maskData.height; j++) { 
       index = (i*4)*maskData.width+(j*4); 
       maskData.data[index] = 255 - (255*4 - stripeTopData.data[index] - stripeBottomData.data[index] - stripeLeftData.data[index] - stripeRightData.data[index]); 
      } 
     } 

这结合了所有四个面具和产生,我以后可以用它来掩盖我的原始图像A B &用黑白。