gpt4 book ai didi

javascript - Canvas 图像展平 - 组合 imageData

转载 作者:行者123 更新时间:2023-12-02 17:29:20 25 4
gpt4 key购买 nike

您好,我已经实现了一个函数,在其中传递带有透明部分的 png 图像 (rgba) 的 imageData 数组。我用下面的代码压平图像,但我有一个关于 alpha 的问题,我需要一些帮助。正如您在下面的屏幕截图中看到的那样,红色文本具有半透明的黑色阴影,但它呈现白色而不是半透明。

enter image description here

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 中完成,这就是我对这种方法感兴趣的原因,因为 webworker 没有 Canvas 访问权限。

最佳答案

您的第一个问题与 putImageData() 函数有关:根据 this answer通过 @ellisbben ,

the putImageData method does not pay any attention to compositing; it merely copies pixel values. In order to get compositing, we need to use drawing operations.

因此,您必须使用内存中的第二个 Canvas (如 this answer@markE 中所述)。

然后,你的第二个问题是你想在网络 worker 中完成它。
你是对的,网络 worker 似乎无法处理此类绘图操作:根据 this answer通过 @AshleysBrain

Web workers can only calculate, not modify the DOM or make any calls to draw to a canvas.

因此,您唯一的方法是通过工作人员处理数据来拆分操作,然后将其绘制到主线程中。

下面是一个示例,假设您的根文件夹中有 2 个 png 文件,分别名为 test0.png 和 test1.png。

index.html

<html>
<body>
<canvas id="canvas"></canvas>
</body>
<script src="main.js"></script>
</html>

ma​​in.js

if (!!window.Worker) {
var myWorker = new Worker("worker.js");

myWorker.onmessage = function(e) {
var tmp=document.createElement("canvas");
tmp.width=512;
tmp.height=512;
var ctx2=tmp.getContext("2d");
ctx2.putImageData(e.data[0],0,0);

var canvas = document.getElementById( 'canvas' );
canvas.width = 512;
canvas.height = 512;
var ctx = canvas.getContext( '2d' );
ctx.fillStyle = "rgb(0,255, 0)";
ctx.fillRect(0,0,250,50);
ctx.drawImage(tmp,0,0);
}
}

var images = [];
function getImagesData(){
for(i=0; i<2; i++){
var img = new Image();
img.src = "test"+i+".png";
//Should add an onload method
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);

images[i] = ctx.getImageData(0,0,img.width,img.height);
}
myWorker.postMessage(images);
}

getImagesData();

Worker.js

var mergeImageData = function( imageDataArray ) {

var newImageData = imageDataArray[ 0 ];

for ( var j = 0; j < imageDataArray.length; j++ ) { // iterate through the imageDataArray


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 ];
}
}
return newImageData;
};


onmessage = function(e) {
var res = mergeImageData(e.data);
postMessage([res]);
}

原始 png 文件
test0.png enter image description here

结果
Result

关于javascript - Canvas 图像展平 - 组合 imageData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28108581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com