我有这个脚本。
var oriToCopy = function(){
while(pps.length > 0){
var pp = pps.pop();
layerDataCopy.data[pp] = layerDataOri.data[pp];
layerDataCopy.data[pp + 1] = layerDataOri.data[pp + 1];
layerDataCopy.data[pp + 2] = layerDataOri.data[pp + 2];
}
ctxCopy.putImageData(layerDataCopy, 0, 0);
}
其中:
pps是画布中像素位置的数组
layerDataOri是来自原始画布的imageData
layerDataCopy是来自Copy canvas
的imageData
我要做的是将layerDataOri.data[pps]
的layerDataOri复制到layerDataCopy.data[pps]
。我检查pps
位置的像素不是透明像素,但是当将此像素复制到layerDataCopy
时,它不受影响,复制画布仍然是透明的。
出了什么问题?
答案 0 :(得分:0)
确保您还复制Alpha通道,因为每个像素由四个通道(RGBA)组成:
layerDataCopy.data[pp] = layerDataOri.data[pp];
layerDataCopy.data[pp + 1] = layerDataOri.data[pp + 1];
layerDataCopy.data[pp + 2] = layerDataOri.data[pp + 2];
layerDataCopy.data[pp + 3] = layerDataOri.data[pp + 3]; // alpha
请注意,pp也必须量化4以指向有效像素(您现在显示如何在问题中生成位置,以防万一)。
如果您从中获取复制缓冲区的画布为空白(没有任何内容),则默认情况下所有像素都是透明的。因此,在复制过程中,在像素上复制alpha通道时,将保持透明。
如果复制缓冲区未包含任何数据(速度更快),您也可以使用createImageData
代替getImageData
。