HTML5 Canvas 요소에서 실행되는 Photoshop 스타일 웹 응용 프로그램을 디자인하고 있습니다. 이 프로그램은 잘 실행되며 방정식에 블렌드 모드를 추가 할 때까지 매우 신속합니다. 각 캔버스 요소를 하나로 병합하고 각 캔버스의 각 픽셀을 아래쪽 캔버스에서 오른쪽 혼합 모드로 결합하여 블렌드 모드를 얻습니다.HTML5 Canvas 픽셀 렌더링 속도 향상
for (int i=0; i<width*height*4; i+=4) {
var base = [layer[0][i],layer[0][i+1],layer[0][i+2],layer[0][i+3]];
var nextLayerPixel = [layer[1][i],layer[1][i+1],layer[1][i+2],layer[1][i+3]];
//Apply first blend between first and second layer
basePixel = blend(base,nextLayerPixel);
for(int j=0;j+1 != layer.length;j++){
//Apply subsequent blends here to basePixel
nextLayerPixel = [layer[j+1][i],layer[j+1][i+1],layer[j+1][i+2],layer[j+1][i+3]];
basePixel = blend(basePixel,nextLayerPixel);
}
pixels[i] = base[0];
pixels[i+1] = base[1];
pixels[i+2] = base[2];
pixels[i+3] = base[3];
}
canvas.getContext('2d').putImageData(imgData,x,y);
다른 블렌드 모드를 위해 블렌드를 호출합니다. 크롬에서
var blend = function(base,blend) {
var fgAlpha = blend[3]/255;
var bgAlpha = (1-blend[3]/255)*base[3]/255;
blend[0] = (blend[0]*fgAlpha+base[0]*bgAlpha);
blend[1] = (blend[1]*fgAlpha+base[1]*bgAlpha);
blend[2] = (blend[2]*fgAlpha+base[2]*bgAlpha);
blend[3] = ((blend[3]/255+base[3])-(blend[3]/255*base[3]))*255;
return blend;
}
내 테스트 결과는 약 400ms 일했다 (시험 브라우저에서 최선의 일부를 산출) 캔버스 620x385 (238,700 픽셀)에 함께 세 개의 레이어를 혼합 다음과 같이 내 '정상'혼합 모드입니다.
대부분의 프로젝트는 크기가 더 크고이 방법으로 실행 시간이 급격하게 늘어나는 레이어가 더 많으므로 아주 작은 구현입니다.
모든 픽셀을 거치지 않고 두 캔버스 컨텍스트를 혼합 모드로 결합하는 더 빠른 방법이 있는지 궁금합니다.
'nextLayerPixel'이란 무엇입니까? 당신은 그것을 어떻게 만들고'blend' 함수 (두번째 매개 변수)에서 그것을 변경합니까? – Bergi
나는 처음에는 그 부분을 배제하여 여분의 코드가 없으면 기능을 보여주지 못했지만 이제는 추가했다. 'nextLayerPixel'은 단순히 각 레이어의 동일한 픽셀을 참조하는 변수이다. 따라서 3 개의 레이어와 픽셀 x : 30, y : 20의 프로젝트에서는 하단 레이어 픽셀을 30,20, 중간 30,20, 상단 30,20에서 가져옵니다. –