2013-05-27 19 views
9

Więc wiem, że context.clearRect sprawia, że ​​piksele są przezroczyste, ale zastanawiam się, czy istnieje funkcja, która sprawia, że ​​piksele są półprzezroczyste?płótno jasne, z alfa

Na przykład, że mam płótno z tych kolorów (czwarta po jednym w każdym kolorze jest alfa):

#ffff #feef #abff 
#5f6f #000f #ffff 

Running clearRect by rozwiązać w ten (lub coś, po prostu zrobić je wszystkie przezroczyste):

#fff0 #fee0 #abf0 
#5f60 #0000 #fff0 

Chcę usunąć przezroczystość, ale nie sprawiają, że przezroczyste (trochę jak globalAlpha dla clearRect), tak, że może skończyć się tak (powiedzmy ustawić globalAlpha równowartość 0,5):

#fff8 #fee8 #abf8 
#5f68 #0008 #fff8 

Czy to możliwe? A może prostsze byłoby narysowanie wszystkiego na płótnie poza ekranem, a następnie narysowanie tego płótna (z zestawem globalAlpha) na ekranie?

Daj mi znać, jeśli nie jest to w żaden sposób jasne.

+0

Możesz użyć 'context.fillColor =" rgba (0-255, 0-255, 0-255, 0-1) "' i użyć fillRect. Czwarty parametr to wartość alfa. 0 jest maksymalnie przezroczyste, a 1 jest całkowicie nieprzezroczyste. –

+0

@ gfcarv tak, to jest coś, czego chcę, ale nie chcę koloru. Chcę usunąć krycie (używam rozmycia ruchu, a tło musi być przezroczyste) – MiJyn

+1

Sprawdź ten wątek: http://stackoverflow.com/questions/5304199/html-canvas-motion-blur-with-transparent -background Myślę, że łatwiej byłoby używać płótna poza ekranem. Możesz użyć 'getImageData', aby zmienić kolory pikseli jeden po drugim i użyć' putImageData' do odzwierciedlenia zmian na płótnie, ale nie chcesz tego robić, ponieważ jest to bardzo nieefektywne. –

Odpowiedz

4

Po prostu próbowałem to sobie wyobrazić i postanowiłem zliczyć piksele, ustawiając kanał alfa każdego z nich ręcznie. To trochę więcej pracy, ponieważ nie mogę po prostu objąć całego płótna za pomocą recta, ale działa to do tej pory.

Robię to, aby ustawić obraz tła strony internetowej i umieścić na nim animację na płótnie, bez konieczności rysowania tła w elemencie canvas.

var oldArray = context.getImageData(0,0,canvas.width,canvas.height); 
//count through only the alpha pixels 
for(var d=3;d<oldArray.data.length;d+=4){ 
    //dim it with some feedback, I'm using .9 
    oldArray.data[d] = Math.floor(oldArray.data[d]*.9); 
} 
sw.context.putImageData(oldArray,0,0); 
+0

Dzięki, chociaż @ gustavo-carvalho dało mi alternatywę, której użyłem, ten odpowiada bezpośrednio na moje pytanie =) – MiJyn

15

Odpowiedź powyżej dostaje zadanie, jednak getImageData jest super powolny, a jeśli masz dużo innych rzeczy dzieje się to spowolni animacji ogromnie. Jeśli utworzysz element canvas z drugiego ekranu, możesz ustawić globalną alfę na .9 i przetasować je w tę iz powrotem i uzyskać ten sam efekt z dużo większą prędkością.

context2.clearRect(0,0,width,height); 
context2.globalAlpha = .9; 
context2.drawImage(canvas1,0,0); 
context1.clearRect(0,0,width,height); 
context1.drawImage(canvas2,0,0); 
context1.the rest of the drawing that you are doing goes here. 
+0

Jest to świetne rozwiązanie, radzę każdemu, kto podchodzi do tego wątku, aby poważnie to rozważyć. –