【发布时间】:2015-01-23 11:09:22
【问题描述】:
您好,我已经实现了一个函数,在该函数中我传递了一个包含透明部分的 png 图像 (rgba) 的 imageData 数组。我使用下面的代码将图像展平,但我有一个关于 alpha 的问题,我可以使用一些帮助。正如您在下面的屏幕截图中看到的那样,红色文本有一个半透明的黑色阴影,而是呈现为白色而不是半透明。
var mergeImageData = function ( imageDataArray ) {
var canvas = document.getElementById( 'canvas' );
canvas.width = 512;
canvas.height = 512;
var ctx = canvas.getContext( '2d' );
var newImageData = imageDataArray[ 0 ];
for ( var j = 1, len = imageDataArray.length; j < len; j++ ) { // iterate through the imageDataArray
console.log( imageDataArray[ j ].data.length );
for ( var i = 0, bytes = imageDataArray[ j ].data.length; i < bytes; i += 4 ) { // iterate through image bytes
var index = ( imageDataArray[ j ].data[ i + 3 ] === 0 ? 0 : j );
newImageData.data[ i ] = imageDataArray[ index ].data[ i ];
newImageData.data[ i + 1 ] = imageDataArray[ index ].data[ i + 1 ];
newImageData.data[ i + 2 ] = imageDataArray[ index ].data[ i + 2 ];
newImageData.data[ i + 3 ] = imageDataArray[ index ].data[ i + 3 ];
}
}
ctx.putImageData( newImageData, 0, 0 );
console.log( "all done" );
};
重要
这将在未来在webworker 中完成,这就是我对这种方法感兴趣的原因,因为网络工作者没有画布访问权限。
【问题讨论】:
-
只是猜测-这一行:newImageData.data[ i + 3 ] = imageDataArray[ index ].data[ i + 3 ];只是将透明度设置为当前 PNG,不应该只是将其设置为 1 吗?
-
值在 0 到 255 之间,如果我将其设置为 1,则展平图像不可见
-
至少你没有得到白色轮廓:-)
-
是因为
putImageData()不注意合成,只读取像素。您需要在内存中的画布中putImageData(),然后将drawImage()这个画布添加到您实际渲染的画布中。 -
您想将纹理混合在一起。你更喜欢多线程而不是硬件加速。很有趣。
标签: javascript canvas web-worker